让以下node.js调用http get REST API。当我运行它时,它返回JSON结果。但是,我在分配结果后尝试将结果发送到console.log
var r
。为什么我总是得到undefined
?看起来我搞乱了javascript范围。任何帮助表示赞赏。
var http = require('http'),
oex_appId = 'myappId',
_hostname = 'openexchangerates.org',
_path = '/api/latest.json?app_id=' + oex_appId;
var r;
function getRates(cb) {
var options = {
hostname: _hostname,
path: _path,
method: 'GET'
};
var responseCallback = function(response) {
var latestRates = '';
var parseCurrencies = function(rates) {
var currencies = JSON.parse(rates);
currencies.rates['USD'] = 1;
return currencies.rates;
};
response.setEncoding('utf8');
response.on('data', function(chunk) {
latestRates += chunk;
}).on('error', function(err) {
throw new Error(err);
}).on('end', function() {
cb(parseCurrencies(latestRates));
});
};
var req = http.request(options, responseCallback);
req.on('error', function(e) {
throw e;
});
req.end();
};
var d = function(data) {
console.log(data["INR"]);
currencies["INR"].amount = data["INR"];
r = data;
};
getRates(d);
console.log(r);
答案 0 :(得分:1)
为什么我总是未定义?
您的问题不是范围问题,而是对异步执行的误解。在此代码中,您将在分配r之前打印r的值。
您的代码执行如下:
通常,您不能指望下一行具有将通过异步回调分配的值。相反,您应该引用回调内的值。在你的情况下,你应该在你的回调函数d。
中移动console.log(r)