光标foreach定时间隔

时间:2017-05-24 00:19:20

标签: javascript meteor

此Meteor服务器代码需要每n秒从集合中打印出一次文档,如何使其工作? thx

      myCol.find({abc: undefined}).forEach(
        function (doc) {
          setTimeout(function (doc) {
               console.log(JSON.stringify(doc));
          }, 1000)
        }
      )

2个问题:doc未定义且计时器未激活,因此它只是一次触发。

1 个答案:

答案 0 :(得分:1)

你不需要一个例子,而是对JS中事件模型的基本理解。 JS是一种单线程语言,当你添加任何assync函数时,无论是通过setTimeoutsetIntervalrequestAnimationFrame,你都可以将它添加到堆栈中。如果满足条件,则引擎会在当前线程完成后逐个触发函数。

在你的例子中,这就是发生的事情:在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);

或类似的东西,你应该得到这个想法,但如果你不这样做,那么告诉我,我会详细说明