节点JS:使用http从API返回具有callback函数的数据

我开始学习Node.js,我试图用Express框架构build一个应用程序,它将查询Coinbase API并获取比特币价格的数据。

我一直在努力,但是因为我对节点上的callback函数很陌生,所以没有任何帮助。

我能够完全查询API并获取数据,但是当它以某种方式返回价格时,它总是以“未定义”的forms返回。

我之前遇到过这个问题,那就是没有使用callback函数的简单查询,所以我认为这是因为缺lesscallback函数。 不过,我现在仍然遇到同样的问题,我尝试了很多次迭代。 我似乎无法find解决scheme。 任何帮助,将不胜感激。

var url = 'https://api.coinbase.com/v2/prices/spot?currency=USD'; function makeCall (url, callback) { https.get(url,function (res) { res.on('data', function (d) { callback(JSON.parse(d)); }); res.on('error', function (e) { console.error(e); }); }); } function handleResults(results){ return Number((results.data.amount))*14.5; } console.log(makeCall(url, function(results){ handleResults(results); })); 

makeCall()实际上不返回任何东西。 所以当你打电话时:

 console.log(makeCall(url, function(results){ handleResults(results); })); 

你正在写makeCall() (这是undefined )的立即返回值到控制台。 你的handleResults()的返回发生得太迟了, console.log()无法得到。

这需要一点习惯。 但是,您需要确定何时需要asynchronouscallback的值,您需要等待访问它。 例如,这将工作:

 function handleResults(results){ console.log(Number((results.data.amount))*14.5;) } 

学习使用承诺可以使一些更直观,更易于阅读。

使用承诺,你可以这样写:

 const https = require('https') var url = 'https://api.coinbase.com/v2/prices/spot?currency=USD'; function makeCall (url) { return new Promise((resolve, reject) => { https.get(url,function (res) { res.on('data', function (d) { resolve(JSON.parse(d)); }); res.on('error', function (e) { reject(e) }); }); }) } function handleResults(results){ return Number((results.data.amount))*14.5; } makeCall(url) .then(function(results){ console.log(handleResults(results)) }) .catch(console.log)