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

假设有一个函数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);

});

});

});

回答:

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...');

}

});

});

});

以上是 如何等待并返回http.request()的结果,以便多个请求串行运行? 的全部内容, 来源链接: utcz.com/qa/427515.html

回到顶部