代码之家  ›  专栏  ›  技术社区  ›  Rafael Pontes

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

  •  0
  • Rafael Pontes  · 技术社区  · 6 年前

    我想使用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);
    }
    

    输出如下:

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    睡几秒钟。。。

    <<<一次所有服务器响应(&T)&燃气轮机&燃气轮机;

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Daryl T    6 年前

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

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

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

    因此,每1000ms(10秒),调用 sendData(Date()) 将执行。

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

    clearInterval(sendDataEveryTenSeconds);
    
        2
  •  0
  •   jfriend00    6 年前

    使用 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);
    }
    

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


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