6

是否有更性感的方式来执行以下操作:

scheduleSubjects.fetch({
    success: function(){
        subjectList.fetch({
            success: function(){
                assignments.fetch({
                    success: function(){
                        _this.render();
                    }
                });
            }
        });
    }
});

我希望在开始操作之前检索所有数据。

谢谢。

4

4 回答 4

8

使用JQuery 的延迟对象,您可以$.when在多个异步调用完成时触发回调:

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch()).then(_this.render);

请注意,这是有效的JQuery.ajax,因为 也因此Backbone.fetch返回了一个延迟对象。


is的替代.then方法.done,它将原始回调的参数传递给您(您在 OP 中不需要,但在某些情况下您可能需要):

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch())
    .done(function(scheduleSubjects, subjectList, assignments) {
        _this.render();
    })
);
于 2013-10-21T23:11:39.260 回答
7
var collections = [scheduleSubjects, subjectList, assignments];
var complete = _.invoke(collections, 'fetch');

$.when(null, complete).then(function(){
    _this.render();
});

使用 Promises 和 Underscore 的_.invoke()!

于 2013-10-21T23:14:24.490 回答
2

您可以使用承诺:

scheduleSubjects.done(function () {
  subjectList.fetch();
});
subjectList.done(function () {
  assignments.fetch();
});
assignments.done(function () {
  _this.render();
});
scheduleSubjects.fetch();

或事件监听器:

subjectList.listenToOnce(scheduleSubjects, 'sync', subjectList.fetch);
assignments.listenToOnce(subjectList, 'sync', assignments.fetch);
this.listenToOnce(assignments, 'sync', this.render);
scheduleSubjects.fetch();

您不必在视图中定义这些侦听器。他们可以生活在应用程序级别。视图唯一关心的是渲染一次assignments被获取

于 2013-10-21T23:01:20.543 回答
0

我能想到的唯一其他方法是使用主干bind()trigger().

通过事件,您可以实现此功能.. 不确定是否有更好的方法。加载第一个集合后,您可以触发第二个集合的加载。理论上,根据您的示例,这两个集合不应耦合。基于事件的加载将subjectListscheduleSubjects.

于 2013-10-21T19:23:15.970 回答