将 Meteor.setTimeout return 值存储在 Collection 中
Store Meteor.setTimeout return value in Collection
我想将 Meteor.setTimeout()
提供的 handle
存储到我自己的计时器 Collection 中。问题是我在执行此操作时遇到 Maximum call stack size exceeded
错误...
客户端我得到一个 int ID
但服务器端我得到一个 object 这样我的 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;
}
无论如何,超时工作正常。使用正确的值调用回调。但是我需要 ID
在某些情况下解除超时...
如果您有想法或解决方案,请随意 =)
这基本上是 setTimeout
的一个缺点,正是出于这个原因,它应该只在会话的基础上使用。您不能将句柄存储在您的数据库中,因为它不是 EJSON 兼容的值,而且我不知道有什么方法可以挑选出一个单独的 EJSON 兼容子对象,然后可以用来检索(并停止)有问题的超时(尽管我有待更正)。
如果您的要求不是很简单,解决方案是使用一个包来安排时间。看看 percolate:synced-cron, which I used for this tutorial.
我想将 Meteor.setTimeout()
提供的 handle
存储到我自己的计时器 Collection 中。问题是我在执行此操作时遇到 Maximum call stack size exceeded
错误...
客户端我得到一个 int ID
但服务器端我得到一个 object 这样我的 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;
}
无论如何,超时工作正常。使用正确的值调用回调。但是我需要 ID
在某些情况下解除超时...
如果您有想法或解决方案,请随意 =)
这基本上是 setTimeout
的一个缺点,正是出于这个原因,它应该只在会话的基础上使用。您不能将句柄存储在您的数据库中,因为它不是 EJSON 兼容的值,而且我不知道有什么方法可以挑选出一个单独的 EJSON 兼容子对象,然后可以用来检索(并停止)有问题的超时(尽管我有待更正)。
如果您的要求不是很简单,解决方案是使用一个包来安排时间。看看 percolate:synced-cron, which I used for this tutorial.