我有一个async
函数,以便生成一系列http请求,我希望在请求之间缓冲1秒。我正在使用async.forEachof
并将迭代器回调函数放在http.request
方法的回调中。代码如下
const async = require('async');
const http = require('http');
let https = require('https');
let fs = require('fs');
async.forEachOf([0,1,2,3], function(tag, index, cb){
let options = {
host: 'www.google.com',
path: '/',
method: 'GET',
};
var waitTill = new Date(new Date().getTime() + 1000);
while(waitTill > new Date()){}
console.log('POST');
https.request(options, function(res){
console.log(res.statusCode);
cb()
}).end(JSON.stringify({}));
});
我希望输出
POST
200
POST
200
等...
相反,我得到
POST
POST
POST
POST
200
200
200
200
因此所有请求都在同时触发,并且迭代不等待前一个函数完成。我不明白。
答案 0 :(得分:0)
这是因为我们传递的回调函数是http.request方法。 这将由节点的事件循环执行,当必要的资源是免费的时,我们通过网络获得响应。(基本上是异步网络呼叫。)
你可以检查async waterfall api,你可以根据需要顺序执行api调用。
下一个选项是使用节点native async await apis。
或者您可以尝试使用co包并使用带有promises的生成器。