如何使用 NodeJS 发送多个顺序定时的 https 请求?
How to send multiple sequentially timed https requests with NodeJS?
我想使用 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);
}
输出结果如下:
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
< < < 所有服务器立即响应 > > >
如图所示,所有响应立即到达,就好像程序在一次发送所有 https 请求之前等待所有迭代完成,而不是像预期的那样每 10 秒一次...
你可以使用setInterval(callback, delay)
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
returns 对定时执行的引用,您可以将其存储在变量中,稍后在需要时调用 clearInterval
停止执行。在您的情况下,您可以设置一个计数器来跟踪函数执行 3 次的时间。
clearInterval(sendDataEveryTenSeconds);
使用 setTimeout()
,而不是 sleep()
来安排 activity 以后的某个时间:
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);
}
除调试外,您几乎不希望将睡眠模块用于任何其他事情,因为它会阻止整个 node.js 事件循环,不允许任何其他事情 运行,包括您的网络请求。相反,您需要使用与 node.js.
的事件循环设计一起正常工作的异步逻辑(如 setTimeout()
)对 node.js 进行编程
注意:这就是您所要求的,及时发送多个请求。但是,当我查看您对结果所做的操作时,您似乎想要确保所有结果都按顺序到达并得到处理。及时发送请求并不能保证这一点。它使它有可能,但不确定。如果您想保证到达顺序或保证处理顺序,您将需要额外的代码。
我想使用 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);
}
输出结果如下:
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
睡了几秒...
< < < 所有服务器立即响应 > > >
如图所示,所有响应立即到达,就好像程序在一次发送所有 https 请求之前等待所有迭代完成,而不是像预期的那样每 10 秒一次...
你可以使用setInterval(callback, delay) 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
returns 对定时执行的引用,您可以将其存储在变量中,稍后在需要时调用 clearInterval
停止执行。在您的情况下,您可以设置一个计数器来跟踪函数执行 3 次的时间。
clearInterval(sendDataEveryTenSeconds);
使用 setTimeout()
,而不是 sleep()
来安排 activity 以后的某个时间:
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);
}
除调试外,您几乎不希望将睡眠模块用于任何其他事情,因为它会阻止整个 node.js 事件循环,不允许任何其他事情 运行,包括您的网络请求。相反,您需要使用与 node.js.
的事件循环设计一起正常工作的异步逻辑(如setTimeout()
)对 node.js 进行编程
注意:这就是您所要求的,及时发送多个请求。但是,当我查看您对结果所做的操作时,您似乎想要确保所有结果都按顺序到达并得到处理。及时发送请求并不能保证这一点。它使它有可能,但不确定。如果您想保证到达顺序或保证处理顺序,您将需要额外的代码。