如何错开http请求?

时间:2017-10-02 15:24:06

标签: node.js

我有一个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

因此所有请求都在同时触发,并且迭代不等待前一个函数完成。我不明白。

1 个答案:

答案 0 :(得分:0)

这是因为我们传递的回调函数是http.request方法。 这将由节点的事件循环执行,当必要的资源是免费的时,我们通过网络获得响应。(基本上是异步网络呼叫。)

你可以检查async waterfall api,你可以根据需要顺序执行api调用。

下一个选项是使用节点native async await apis。

或者您可以尝试使用co包并使用带有promises的生成器。