$.when 显然被忽略

$.when apparently ignored

我有一个代表任务列表的复合视图,其中 header 包含此类列表中任务的计数器。

我已经为计数器定义了一个 ui 散列来处理它并正确初始化它:

观点:

 ui: {
        counter: "#counter",
 },

 onRender: function(){
        this.ui.counter.text(this.collection.length);
 }

我遇到的问题是 collection.length 在呈现 collection 时有时为 0。虽然呈现了任务模型。有时,我的意思是有时 collection.length 会有正确的值,有时却没有。这看起来像一个竞争条件。但是,我确保 collection 在创建视图之前就已获取,显然,在显示它们之前。

我的控制器的一个简化示例如下所示:

showTasks: function(){
        //layout
        var kanbanLayout = new View.Layout();

        //tasks
        var backlogFetch = App.request("backlog:task:entities");

        $.when(backlogFetch).done(function(backlogTasks){
             var backlog = new View.Column({
                    collection: backlogTasks,
             });

             kanbanLayout.on("show", function(){
                    kanbanLayout.backlog.show(backlog);
             });

             App.once("fetched:kanban", function(){
                App.mainLayout.mainRegion.show(kanbanLayout);
             });
        }
}   

如您所见,我正在等待获取数据,但显然在获取数据之前执行了代码。知道我做错了什么吗?

我的完整代码:

如您所见,它严格遵循 David Sulc 的结构:https://github.com/davidsulc/structuring-backbone-with-requirejs-and-marionette/blob/master/assets/js/apps/contacts/show/show_controller.js#L13

您需要定义您的任务实体,否则不会请求此文件,因此不会设置处理程序

define([
    'app',
    'apps/kanban/show/show_view',
    'entities/task'
], function(App, View){

很难发现,因为 marionette 不会在您请求不存在的处理程序时告诉您。

正如@hindmost 在评论中建议的那样,我三次检查了 promise 是否正确返回,但没有,功能代码如下所示:

var API = {
   getTasks: function(state, kanban_id){
   Entities.tasks = new Entities.TaskCollection([], {'state' : state, 'kanban_id': kanban_id});
   var defer = $.Deferred();
   Entities.tasks.fetch({
       beforeSend: function(xhr) {
           xhr.setRequestHeader('Authorization','token '+App.loggedInUser.token);
       },
       success: function(data){
           defer.resolve(data);
       }
   });
   var promise = defer.promise();
   return promise;
}