我想使用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秒发送一次...
答案 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的事件循环设计一起正常工作。
注意:这就是您要求的,发送多个间隔时间的请求。但是,当我查看您对结果所做的事情时,您似乎希望确保所有结果到达并按顺序处理。发送时间间隔的请求不一定能保证。它很可能,但不确定。如果您想保证到货订单或保证处理订单,您需要额外的代码。