如何等待并返回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-promise
从doRequest
函数中返回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