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

kkp*_*kpn 9 collections backbone.js

如果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.
Run Code Online (Sandbox Code Playgroud)

我知道有一种方法可以使用$ .when()或_.after()这样的答案. 如何同步多个Backbone.js提取?

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

jev*_*lio 10

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

var callback = _.after(2, view.render);
collectionA.once('sync', callback, view);
collectionB.once('sync', callback, view);
Run Code Online (Sandbox Code Playgroud)

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

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

用法:

onceAll([collectionA, collectionB], 'sync', view.render, view);
Run Code Online (Sandbox Code Playgroud)

/代码样本未经测试.