【发布时间】:2014-04-10 17:13:45
【问题描述】:
我正在使用Meteor._wrapAsync 强制只调用一次函数writeMeLater
随时执行。如果在 1 秒内拨打了 10 次对writeMeLater 的呼叫,则其他 9 次呼叫应按顺序排队。
要检查writeMeLater 是否同步运行,Logs 集合中的timestamp 字段应间隔 1 秒。
问题:使用以下代码,只执行了对writeMeLater 的第一次调用,其他9 个似乎没有运行。为什么会这样?
服务器代码:
writeMeLater = function(data) {
console.log('writeMeLater: ', data)
// simulate taking 1 second to complete
Meteor.setTimeout(function() {
Logs.insert({data: data, timestamp: new Date().getTime()})
}, 1 * 1000)
}
writeMeLaterSync = Meteor._wrapAsync(writeMeLater)
// simulate calling the function many times real quick
for(var i=0; i<10; i++) {
console.log('Loop: ', i)
writeMeLaterSync(i)
}
输出:
=> Meteor server running on: http://localhost:4000/
I20140119-11:04:17.300(8)? Loop: 0
I20140119-11:04:17.394(8)? writeMeLater: 0
使用writeMeLater 的替代版本,我遇到了同样的问题:
writeMeLater = function(data) {
console.log('writeMeLater: ', data)
setTimeout(Meteor.bindEnvironment( function() {
Logs.insert({data: data, timestamp: new Date().getTime()})
}), 1 * 1000)
}
【问题讨论】:
标签: javascript node.js meteor