我正在尝试构建一个简单的Web应用程序来提取比特币价格的API数据。我能够解析数据并提取价格。但是,鉴于Node.js的异步性质,当我尝试返回它在http请求完成之前返回的数据时。
这就是我插入回调函数的原因。但是,当它返回价格时,它仍然是未定义的。因此,我假设即使使用回调发送回报,请求也不完整?
我也听说过其他解决方案,例如promises和async但我找不到从函数中返回price变量的方法。我需要能够这样做,以便我可以对返回的变量进行单独的计算。
免责声明:我是节点新手,所以任何帮助将不胜感激
var https = require('https');
function myCallback(result) {
return result;
}
var price = 0;
function getData(callback) {
var url = "https://api.coinbase.com/v2/prices/spot?currency=USD";
https.get(url, function(res){
var body = '';
res.on('data', function(chunk){
body += chunk;
});
res.on('end', function(){
var exData = JSON.parse(body);
price = Number((exData.data.amount))*14.5;
callback(price);
});
}).on('error', function(e){
console.log("Got an Error: ", e);
});
};
var y = getData(myCallback);
console.log(y);

答案 0 :(得分:0)
当你从javascript开始时,很难开始考虑异步操作。执行console.log(y)
时,HTTPS调用尚未完成,因此一旦节点中的主要IO功能为non-blocking,就无法以此方式调用。您需要做的是在myCallback
函数内调用console.log。
var https = require('https');
function myCallback(result) {
console.log(result);
}
var price = 0;
function getData(callback) {
var url = "https://api.coinbase.com/v2/prices/spot?currency=USD";
https.get(url, function(res){
var body = '';
res.on('data', function(chunk){
body += chunk;
});
res.on('end', function(){
var exData = JSON.parse(body);
price = Number((exData.data.amount))*14.5;
callback(price);
});
}).on('error', function(e){
console.log("Got an Error: ", e);
});
}
getData(myCallback);
编辑: 问题是,你可以在回调之外设置一个变量的值,你仍然必须确保你只在归属后使用这个变量。您仍然必须以这种或那种方式使用回调。
还有另一种传递回调方式,它有更好的方式来实现这一点,承诺。我相信这就是你要找的东西。
var https = require('https');
var price = 0;
function getData() {
var promise = new Promise(function(resolve, reject) {
var url = "https://api.coinbase.com/v2/prices/spot?currency=USD";
https.get(url, function(res){
var body = '';
res.on('data', function(chunk){
body += chunk;
});
res.on('end', function(){
var exData = JSON.parse(body);
price = Number((exData.data.amount))*14.5;
resolve(price);
});
}).on('error', function(e){
console.log("Got an Error: ", e);
reject(e);
});
})
return promise;
}
var y = getData()
y.then(function (result) {
console.log('price: ' + result);
});