使用Callbacks和https.get将已解析的JSON API数据作为变量返回

时间:2017-11-12 12:39:44

标签: javascript json node.js asynchronous promise

我正在尝试构建一个简单的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);




1 个答案:

答案 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);
});