我有一个用于安排任务的NodeJS应用程序,该任务用于创建预订,可以在执行任务之前取消预订,可能有数十万个任务(例如,在一分钟内创建67个任务)
我这样做的方法是调用此函数:
runOnDate = function (dateIn){
console.log('scheduling')
var now = (new Date()).getTime();
var booking = setTimeout(startBooking , (dateIn - now));
//Lets try to catch the ID number of booking
console.log(booking) // Shows [object Object]
console.log(booking.timeoutID) // Shows undefined
}
如果我必须取消其中一个setTimeout
,我的问题就开始了,我知道setTimeout
会将Number
与clearTimeout()
一起使用,而是clearTimeout()
。
但我似乎无法得到这个数字,有没有办法创建一个带有唯一ID 的计时器,我可以用clearTimeout
或其他方式调用{{1在特定的setTimeout
?
答案 0 :(得分:2)
clearTimeout
应该传递从setTimeout
返回的任何内容。 node
没有为其计时器返回number
,而是返回object
。所以在这种情况下,你应该通过传递对象来做clearTimeout(booking)
。在浏览器中,它返回一个数字。
setTimeout
/ clearTimeout
是浏览器API的一部分,不是JS标准,因此不要求它们甚至在Node中提供,更不用说它们具有相同的参数/返回值。在node
计时器中会产生一个对象,因为计时器可以有方法。
鉴于你所说的话,我还建议你考虑使用某种任务队列而不是启动大量的计时器。你最好维护一个任务队列,并通过维持一个计时器,在他们的开始时间到来时将事情从队列中拉出来。