【问题标题】:How do I return a value from my Node.js module AFTER it has been updated by an async function? [duplicate]如何在 Node.js 模块被异步函数更新后返回一个值? [复制]
【发布时间】:2016-05-31 05:13:38
【问题描述】:

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

我正在编写一个非常简单的节点应用程序,它从 web api 获取股票价格,从另一个 web 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 语句,但这也不起作用。

有人可以帮忙吗?

【问题讨论】:

  • 异步导致异步:还没有价值。推广模式all;最好使用 Promises 或 ReactJS - 根据需要使用显式回调来粘合到节点本身(但有很好的 promisify-wrappers)。
  • 对于拥有数千个帖子的你们来说,这可能看起来像是一个副本,但对于一个拥有 15 个帖子的全新开发人员来说,这就像比较一个苹果和一个橙子。在做出这样的决定之前,花点时间回忆一下作为一名新开发人员的感受如何。因此,这可能与另一篇帖子相似,这并不意味着我可以通过该帖子回答我的问题,并且我的问题仍然需要帮助。
  • 编程涉及识别问题、概括解决方案以及将知识应用于具体情况。如果在阅读了其他已发布的回复后仍有问题/问题,则要求对某些问题进行具体说明 - 最好提供支持性参考。超过 2000 票的问题解释了确切的问题并导致下一步。最好不要太个人化:}

标签: javascript node.js asynchronous return


【解决方案1】:

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

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

如果有错别字,请见谅。

【讨论】:

  • 如果GetStockPrice有任何错误,调用者永远不会知道。
  • 你也可以处理其中的错误。
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2020-09-12
  • 2016-01-14
相关资源
最近更新 更多