在Collection中存储Meteor.setTimeout返回值

时间:2015-01-21 14:20:11

标签: javascript meteor timeout

我希望将handle Meteor.setTimeout()赠送到我自己的定时器集合中。问题是我在执行此操作时遇到Maximum call stack size exceeded错误...

客户端我得到int ID但服务器端我收到这样的对象,我的update函数不想存储...

{ _idleTimeout: 10000,
  _idlePrev: 
  { _idleNext: [Circular],
    _idlePrev: [Circular],
    msecs: 10000,
    ontimeout: [Function: listOnTimeout] },
 _idleNext: 
  { _idleNext: [Circular],
    _idlePrev: [Circular],
    msecs: 10000,
    ontimeout: [Function: listOnTimeout] },
 _idleStart: 1421848999217,
 _monotonicStartTime: 4341630336,
 _onTimeout: [Function],
 _repeat: false }

查看我的代码(仅限服务器端),这里是计时器创建:

triStartTimer: function (timerId, timerDuration)
{   
    var meteorTimer = Meteor.setTimeout(function()  {timerCallbackTimeout(timerId);}, timerDuration);
    console.log(meteorTimer);
    var start = new Date().getTime();

    var data = {
        duration : timerDuration,
        timerID : meteorTimer,
        start : start,
        state : timerStateEnum.RUNNING
    };

    var ret = updateTimerInfos(timerId, data);
    return ret;
},

获取Maximum call stack size exceeded的更新功能:

var updateTimerInfos = function (id, data)
{
  var ret = Timers.update(id,
  {
    $set :
    {
        duration : data.duration,
        timerID : data.timerID,   // Without this, the function works fine
        start : data.start,
        state : data.state
    }
  }, function (error, result)
  {
    if (error)
    {
        console.log("updateTimer FAILED !!!");
        console.log("reason : " + error.message);
    }
  } );
  return ret;
}

无论如何,Timeout工作正常。使用正确的值调用回调。但我需要ID在某些条件下解除超时......

如果您有想法或解决方案,请随意=)

1 个答案:

答案 0 :(得分:1)

这基本上是setTimeout的缺点,正是出于这个原因,才应该在会话基础上使用{{1}}。您无法在数据库中存储句柄,因为它不是EJSON兼容的值,而且我不知道如何选择单个与EJSON兼容的子对象然后可以用来检索(并停止)有问题的超时(虽然我有待纠正)。

解决方案是使用包进行调度,如果您的要求不是非常简单。请查看我percolate:synced-cron使用的this tutorial