我有一个包含队列的服务。注入此服务的任何内容都可以将对象添加到服务的队列中。我需要该服务异步删除此队列中的项目,然后运行它们。有一个像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
});
答案 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之类的插件来帮助您安排。