NodeJs为clearTimeout设置setTimeout唯一ID

时间:2014-03-30 12:26:47

标签: javascript node.js scheduled-tasks settimeout cleartimeout

我有一个用于安排任务的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会将NumberclearTimeout()一起使用,而是clearTimeout()

但我似乎无法得到这个数字,有没有办法创建一个带有唯一ID 的计时器,我可以用clearTimeout或其他方式调用{{1在特定的setTimeout

1 个答案:

答案 0 :(得分:2)

clearTimeout应该传递从setTimeout返回的任何内容。 node没有为其计时器返回number,而是返回object。所以在这种情况下,你应该通过传递对象来做clearTimeout(booking)。在浏览器中,它返回一个数字。

setTimeout / clearTimeout是浏览器API的一部分,不是JS标准,因此不要求它们甚至在Node中提供,更不用说它们具有相同的参数/返回值。在node计时器中会产生一个对象,因为计时器可以有方法。

鉴于你所说的话,我还建议你考虑使用某种任务队列而不是启动大量的计时器。你最好维护一个任务队列,并通过维持一个计时器,在他们的开始时间到来时将事情从队列中拉出来。