此Meteor服务器代码需要每n秒从集合中打印出一次文档,如何使其工作? thx
myCol.find({abc: undefined}).forEach(
function (doc) {
setTimeout(function (doc) {
console.log(JSON.stringify(doc));
}, 1000)
}
)
2个问题:doc未定义且计时器未激活,因此它只是一次触发。
答案 0 :(得分:1)
你不需要一个例子,而是对JS中事件模型的基本理解。 JS是一种单线程语言,当你添加任何assync函数时,无论是通过setTimeout
,setInterval
,requestAnimationFrame
,你都可以将它添加到堆栈中。如果满足条件,则引擎会在当前线程完成后逐个触发函数。
在你的例子中,这就是发生的事情:在forEach函数中,你要添加annon函数,为每个元素调用它。
因此,在单线程中遍历集合。在这个线程中,annon函数正在添加超时函数,但它们不会立即调用。它们被添加到堆栈中。并且在当前线程(在这种情况下是遍历集合的遍历)完成执行之前,不会调用此堆栈中的函数。
当前线程完成后,JS引擎从堆栈中获取函数并检查当前函数的条件是否得到满足(例如从添加到堆栈时起1000ms)。因为对于所有添加的超时回调,条件都满足(1000ms,如果它们通过第一次回调,那么它们肯定会传递给后续的回调)。他们一个接一个地被解雇,这一切都在你看来。
示例如下:
var i = 0;
function traverseInLoop() {
console.log(JSON.stringify(myCol[i]));
if (myCol(++i) {
setTimeout(traverseInLoop, 1000)
}
}
setTimeout(traverseInLoop, 1000);
或类似的东西,你应该得到这个想法,但如果你不这样做,那么告诉我,我会详细说明