如何通过异步函数更新我的Node.js模块后返回值?

时间:2016-05-31 05:13:39

标签: javascript node.js asynchronous return

原谅我,但作为一个非常新的开发者,我没有看到这是如何与所提到的问题完全重复。我不知道ajax是什么,我当然不明白如何调整所提出的解决方案以适应我的情况。

我正在编写一个非常简单的节点应用程序,它从网络API获取股票价格,从另一个网络API获取货币转换价值,并将股票价格从美元转换为澳元。我把它完美地放在一个文件中,但是我已经选择将它拆分成几个模块以使其更容易。现在我已经打破了它:)

基本上我将希望查询的股票代码传递给我的GetStockPrice()函数,该函数然后执行必要的查询并在理论上返回结果.....

这就是我调用模块的方式:

var returned = GetStockPrice('AMZN');
console.log(returned);

返回值始终为10,因为我的GetStockPrice模块中没有更新。

以下是我模块中的代码:

var http = require('http');
var stockPrice = 10;

function GetStockPrice(ticker) {
  var options = {
    host: 'dev.markitondemand.com',
    port: 80,
    path: '/MODApis/Api/v2/Quote/json?symbol=' + ticker,
    method: 'GET'
  };
  http.request(options, function(res) {
    console.log('STATUS: ' + res.statusCode);
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
      const json = JSON.parse(chunk);
      stockPrice = json.LastPrice;
    });
  }).end();

  return (stockPrice)

};

module.exports = GetStockPrice;

我理解我做错了什么,http.request是异步运行的,所以当我的函数进入return语句时,异步调用还没有完成,所以我的返回值, stockPrice,仍然与我第一次初始化时相同。不幸的是,我不知道如何解决它。我尝试在http.request函数中移动return语句,但这也不起作用。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以使用回调来获取异步函数的响应。

var http = require('http');
var stockPrice = 10;


function GetStockPrice(ticker, callback){
   var options = {
      host: 'dev.markitondemand.com',
      port: 80,
      path: '/MODApis/Api/v2/Quote/json?symbol=' + ticker,
      method: 'GET'
   };
   http.request(options, function(res) {
      console.log('STATUS: ' + res.statusCode);
      res.setEncoding('utf8');
      var stockPrice='';
      res.on('data', function (chunk) {
        stockPrice = stockPrice + chunk;
      });
      res.on('end', function(){
          return callback(JSON.parse(stockPrice));     
      });
   });
};

module.exports = GetStockPrice;

并且

GetStockPrice('AMZN', function(data){
   console.log(data);
});

请原谅我,如果有任何错别字。