一尘不染

如何等待并返回http.request()的结果,以便多个请求串行运行?

node.js

假设有一个函数doRequest(options),应该执行一个HTTP请求并将其http.request()用于该请求。

如果doRequest()在循环中调用if
,我希望下一个请求是在上一个完成之后执行的(串行执行,一个接一个)。为了不使回调和Promises混乱,我想使用async /
await模式(与Babel.js一起编译以与Node 6+一起运行)。

但是,我不清楚如何等待响应对象进行进一步处理,以及如何作为以下结果返回它doRequest()

var doRequest = async function (options) {

    var req = await http.request(options);

    // do we need "await" here somehow?
    req.on('response', res => {
        console.log('response received');
        return res.statusCode;
    });
    req.end(); // make the request, returns just a boolean

    // return some result here?!
};

如果我使用 mocha
为HTTP请求使用各种选项来运行当前代码,那么所有请求似乎都是同时发出的。它们都失败了,可能是因为doRequest()实际上没有返回任何东西:

describe('Requests', function() {
    var t = [ /* request options */ ];
    t.forEach(function(options) {
        it('should return 200: ' + options.path, () => {
            chai.assert.equal(doRequest(options), 200);
        });
    });
});

阅读 768

收藏
2020-07-07

共1个答案

一尘不染

async/await兑现承诺。仅当async您要使用的函数await返回Promise时,它们才起作用。

要解决您的问题,您可以使用类似的库,也可以request-promisedoRequest函数中返回promise 。

这是使用后者的解决方案。

function doRequest(options) {
  return new Promise ((resolve, reject) => {
    let req = http.request(options);

    req.on('response', res => {
      resolve(res);
    });

    req.on('error', err => {
      reject(err);
    });
  }); 
}

describe('Requests', function() {
  var t = [ /* request options */ ];
  t.forEach(function(options) {
    it('should return 200: ' + options.path, async function () {
      try {
        let res = await doRequest(options);
        chai.assert.equal(res.statusCode, 200);
      } catch (err) {
        console.log('some error occurred...');
      }
    });
  });
});
2020-07-07