Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js http REST调用问题上的回调_Javascript_Node.js - Fatal编程技术网

Javascript node.js http REST调用问题上的回调

Javascript node.js http REST调用问题上的回调,javascript,node.js,Javascript,Node.js,对http get REST API进行以下node.js调用。当我运行它时,它返回JSON结果。但是,我正在尝试将结果分配到console.logvar r上。为什么我总是得到未定义的?看起来我搞乱了javascript的作用域。感谢您的帮助 var http = require('http'), oex_appId = 'myappId', _hostname = 'openexchangerates.org', _path = '/api/latest.json?

对http get REST API进行以下node.js调用。当我运行它时,它返回JSON结果。但是,我正在尝试将结果分配到
console.log
var r
上。为什么我总是得到未定义的
?看起来我搞乱了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);
为什么我总是没有定义

您的问题不是范围问题,而是对异步执行的误解。在该代码中,您将在分配r之前打印r的值

代码的执行如下所示:

  • 调用getRates()
  • 调用console.log(r)(因此未定义)
  • 当在getRates中执行的请求完成时,将执行回调。这是指您正在将值分配给r,但由于您已经打印了该值,因此已经太晚了

  • 通常,您不能期望下一行具有通过异步回调分配的值。相反,您应该引用回调中的值。在您的情况下,您应该将console.log(r)移动到回调函数d中。

    Hector,谢谢您的回复。我需要将r传递到module.exports。这就是为什么我要从异步执行中打印console.log(r)。是否可以像module.exports=r那样将“var r”传递给module.exports?