假设有一个函数doRequest(options),应该执行一个HTTP请求并将其http.request()用于该请求。
doRequest(options)
http.request()
如果doRequest()在循环中调用if ,我希望下一个请求是在上一个完成之后执行的(串行执行,一个接一个)。为了不使回调和Promises混乱,我想使用async / await模式(与Babel.js一起编译以与Node 6+一起运行)。
doRequest()
但是,我不清楚如何等待响应对象进行进一步处理,以及如何作为以下结果返回它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时,它们才起作用。
async/await
async
await
要解决您的问题,您可以使用类似的库,也可以request-promise从doRequest函数中返回promise 。
request-promise
doRequest
这是使用后者的解决方案。
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...'); } }); }); });