如何在从调用函数返回之前等待Node.JS中的异步http请求结果?

时间:2018-06-03 11:22:42

标签: node.js

我正在开发一个 Node.JS 函数,该函数必须做两件事 - 从API请求一些数据,处理它并将其返回给调用者。

问题是API调用(使用https模块)是异步的,我的函数在API调用返回数据之前返回。这是我的代码:

const https = require('https');

const options = {
  hostname: 'tmp-s.s3.amazonaws.com',
  port: 443,
  path: '/groups.json',
  method: 'GET',
};

const MyHandler = {
  handle(handlerInput) {
    var group_name;
    api_call = function() {
      return new Promise( (resolve, reject) => {
        req = https.request(options, function(res){
          var data = '';

          //console.log('statusCode:', res.statusCode);
          //console.log('headers:', res.headers);

          res.on('data', function(d){ data += d; });

          res.on('end', function(){
            console.log(data);
            var _groups = JSON.parse(data);
            var _group_name = _groups[1].name;
            console.log("In res.on(): " + _group_name);
            resolve(_group_name);  // RESOLVE the promise
          });
        });
        req.end();
      });
    }

    api_call().then((value) => {
      group_name = value; // I have to return this _value_ from MyHandler.handle()
      return group_name;  // This returns from the then()-function, not from MyHandler.handle()
    });

    return group_name;  // This returns before group_name is set :(
  }
}

// Just for testing - something else calls MyHandler.handle()
console.log("In main(): " + MyHandler.handle("blah"));

以上版画:

In main(): undefined
In res.on(): Group 1

我想要的是反向序列,没有未定义的结果:

In res.on(): Group 1
In main(): Group 1

有人将我之前提出的问题视为This question的副本,但我仍无法使其成功。试图添加Promise,但仍无法等待handle()功能完成。我无法控制MyHandler.handle()的调用者 - 它调用我的函数,我必须返回API调用结果。我无法改变来电者的任何内容。

如果有人可以帮助我使用我的示例代码,而不是将其再次关闭作为远程类似于我无法工作的复制品,我会更喜欢。 请:)

1 个答案:

答案 0 :(得分:0)

而是返回group_name值,在MyHandler.handle中返回承诺:

return api_call();

然后你必须等待:

MyHandler.handle("blah").then(value => {
    console.log(value);
});

我希望它有所帮助:)