0

我有一个用于调度任务的 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()

但我似乎无法得到号码,有没有办法创建一个具有唯一 ID的计时器,我可以使用它clearTimeout()或其他方式来调用clearTimeout特定的setTimeout

4

1 回答 1

3

clearTimeout应该传递从返回的任何内容setTimeoutnodenumber为其计时器返回 a,而是返回一个object. 因此,在这种情况下,您应该clearTimeout(booking)通过将对象传递给它。在浏览器中,它返回一个数字。

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

鉴于您所说的,我还建议您考虑使用某种任务队列而不是启动大量计时器。您最好维护一个任务队列,并在它们的开始时间到达时将它们从队列中拉出,只需维护一个计时器即可。

于 2014-03-30T17:26:40.147 回答