有没有办法等待调用回调,直到多个主干集合同步?

时间:2013-04-16 09:27:07

标签: backbone.js collections

如果collectionA和collectionB都触发了'sync'事件,我想运行view.render()。 这样的事情。

collectionA = new CollectionA();
collectionB = new CollectionB();

view.listenTo([collectionA, collectionB], 'sync', view.render);

collectionA.fetch(); // do not call view.render yet.
collectionB.fetch(): // call view.render after fetch.

我知道有一种方法可以使用$ .when()或_.after()这样的答案。 How to synchronize multiple Backbone.js fetches?

但我认为这些不是事件驱动的方式。 Backbone.js上有任何事件驱动方式吗?

1 个答案:

答案 0 :(得分:10)

你可以使用下划线after方法的组合来仅在多次调用时执行回调,并使用Backbone.Events.once来确保不会过早地触发处理程序,如果有的话这些集合会触发两个sync个事件,而不是每个事件中的一个:

var callback = _.after(2, view.render);
collectionA.once('sync', callback, view);
collectionB.once('sync', callback, view);

或者您可以将逻辑包装到实用程序函数中,因此您可以将它与可变数量的事件源一起使用:

function onceAll(eventSources, eventName, handler, context) {
  handler = _.after(eventSources.length, handler);
  context = context || this;
  _.each(eventSources, function(source) {
      source.once(eventName, handler, context);
  });
}

用法:

onceAll([collectionA, collectionB], 'sync', view.render, view);

/代码样本未经测试。