回调node.js http REST调用问题

时间:2014-03-24 00:36:40

标签: javascript node.js

让以下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);

1 个答案:

答案 0 :(得分:1)

  

为什么我总是未定义?

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

您的代码执行如下:

  1. getRates()被称为
  2. 调用console.log(r)(因此未定义)
  3. 当getRates中执行的请求完成后,您的回调即执行。这是当你为r分配一个值时,但是那时已经太晚了,因为你已经打印过了。
  4. 通常,您不能指望下一行具有将通过异步回调分配的值。相反,您应该引用回调内的值。在你的情况下,你应该在你的回调函数d。

    中移动console.log(r)