如何使用NodeJS发送多个顺序定时的https请求?

时间:2018-03-31 05:08:26

标签: json node.js https delay

我想使用NodeJS发送多个https请求。 每个必须在几秒钟内选择的延迟时间内触发。我使用了这段代码:

const https = require('https');
const sleep = require('sleep');

function sendData(time) {

  var postData = JSON.stringify({
    "time":time
  });

  var options = {
    host: 'hostname.com',
    port: 443,
    path: '/path',
    method: 'POST',
    headers: {
         'Content-Type': 'application/json',
         'Content-Length': postData.length
       }
  };

  var req = https.request(options, (res) => {
    console.log('statusCode:', res.statusCode);
    console.log('headers:', res.headers);

    res.on('data', (d) => {
      process.stdout.write(d);
    });
  });

  req.on('error', (e) => {
    console.error(e);
  });

  req.write(postData);
  req.end();
}

for (var i = 0; i < 3; i++) {
   var timeDate = new Date();
   sendData(timeDate.getTime());
   console.log("Sleeping for some seconds...");
   sleep.sleep(10);
}

输出如下:

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

睡几秒钟......

&LT; &LT; &LT;所有服务器响应一次&gt; &GT; &GT;

如图所示,所有响应立即到达,就像程序在发送https请求之前等待所有迭代完成一样,而不是每10秒发送一次...

2 个答案:

答案 0 :(得分:1)

你可以使用setInterval(回调,延迟) https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_args

第一个参数callback接受要执行的函数。 第二个参数delay接受以毫秒为单位的时间。 每次延迟过去都会执行回调。

let sendDataEveryTenSeconds = setInterval(function(){
    sendData(Date());
},1000);

所以每隔1000毫秒(10秒),调用sendData(Date())的匿名函数就会执行。

在您的示例中,您希望它在3次后停止。 setInterval返回对定时执行的引用,您可以将其存储在变量中,稍后调用clearInterval以在需要时停止执行。在您的情况下,您可以设置一个计数器来跟踪函数执行3次的时间。

clearInterval(sendDataEveryTenSeconds);

答案 1 :(得分:0)

使用setTimeout(),而非sleep()来安排未来某个时间的活动:

const delay = 3000;     // set to whatever you want the spacing to be in ms
for (var i = 0; i < 3; i++) {
   setTimeout(function() {
       console.log("sending data " + i);
       var timeDate = new Date();
       sendData(timeDate.getTime());
   }, delay * i);
}

您不希望将sleep模块用于除调试之外的任何事情,因为它会阻止整个node.js事件循环,该循环不允许运行任何其他内容,包括您的网络请求。相反,您需要使用异步逻辑(如setTimeout())对node.js进行编程,该逻辑与node.js的事件循环设计一起正常工作。

注意:这就是您要求的,发送多个间隔时间的请求。但是,当我查看您对结果所做的事情时,您似乎希望确保所有结果到达并按顺序处理。发送时间间隔的请求不一定能保证。它很可能,但不确定。如果您想保证到货订单或保证处理订单,您需要额外的代码。