Ember Run Loop澄清

时间:2016-08-23 13:43:21

标签: ember.js

我有一个包含队列的服务。注入此服务的任何内容都可以将对象添加到服务的队列中。我需要该服务异步删除此队列中的项目,然后运行它们。有一个像service.processQueue()这样调用的周期函数会很好。这是使用Ember Run Loop的正确用例吗?如何永久地将它添加到Ember.RunLoop,而不是只运行一次?

编辑: 我注意到文档中有两种方法:http://emberjs.com/api/classes/Ember.run.html#method_schedule

run.schedule('sync', this, function() {
  // this will be executed in the first RunLoop queue, when bindings are synced
  console.log('scheduled on sync queue');
});

run.schedule会将此永久添加到Ember Run Loop吗?

function sayHi() {
  console.log('hi');
}

run(function() {
  run.scheduleOnce('afterRender', myContext, sayHi);
  run.scheduleOnce('afterRender', myContext, sayHi);
  // sayHi will only be executed once, in the afterRender queue of the RunLoop
});

1 个答案:

答案 0 :(得分:3)

run.schedule的作用是,它调度回调在某个队列中运行一次。与run.scheduleOnce的区别在于,如果您将相同的函数传递两次,就像在您展示的文档中那样,它只运行一次函数。

在代码中:

function sayHi() {
  console.log("hi");
}

run(function() {
  schedule('afterRender', myContext, sayHi);
  schedule('afterRender', myContext, sayHi);
}
// hi
// hi

run(function() {
  run.scheduleOnce('afterRender', myContext, sayHi);
  run.scheduleOnce('afterRender', myContext, sayHi);
});
// hi

如果你想定期运行某个函数,你想要的是一个递归函数,即一个在设定的区间内调用自身的函数。您可以自己完成,例如tick function in this Twiddle example

tick: function() {
  // ...

  Ember.run.later(this, this.tick, 1000);
},

或者您可以使用ember-concurrency之类的插件来帮助您安排。