为什么在使用定义函数时无法获取 Backbone 集合模型?

Why can't get Backbone collection models when using a defined function?

假设我们有一个给定集合的实例(url 在集合定义中指定),例如:

var collection = new SomeCollection(),
    async = collection.fetch();

当我在 done 方法中使用匿名回调时,它工作得很好,如下例所示:

async.done(function(){
    console.log('models are : ',collection.models)    
});

但是当我定义一个 全局函数 并尝试使用它而不是以前完成的回调时,为了稍微组织代码,我得到一个空模型数组 :

function done(collection){
   console.log('models are : ',collection.models) 
} 


async.done(done(collection));

这里到底是什么问题? 为什么它在提取调用之前采用收集状态?

注:我也试过使用.bind.call.apply,但不行工作 !.

提前致谢。

async.done 将函数作为参数。问题是你实际上将函数的结果作为参数传递给 async.done。您需要将函数作为参数传递而不应用它。

试试下面的代码:

function done(collection){
  console.log('models are : ',collection.models) 
} 

function success(collection){
  console.log('response: ',collection) 
}     

var collection = new SomeCollection(),
async = collection.fetch();

// you can use success or done method
// you can bind collection argument by yourself
async.success(success);
async.done(done.bind(this, collection));

这个怎么样?

var collection = new SomeCollection(),
    async = collection.fetch({
        success: done
    });


function done(collection, response, options) {
   console.log('models are : ', collection.models) 
} 

您提供的示例代码的问题是您没有将 done 方法传递给 then(),但它是 return 值,正如 Volodymyr Synytskyi 在他的回答中所解释的那样.


jQuery xhr 对象不知道 backbone.js 的存在(例如 collection/model 中定义的 parse 方法基于backbone 更新 collection/model)

当请求成功时,将触发成功回调。无法保证当这些触发时,backbone 会根据响应完成所有模型的创建。

这就是 backbone 提供成功回调的原因,它将在 backbone 完成其活动后触发。

您可以将全局处理程序作为成功回调传递,它将按 collection/modelresponseoptions 作为参数按此顺序调用。

function done(collection,response,options){
  console.log('models are : ',collection.models)
}

var collection = new SomeCollection(),
collection.fetch({
 success: done
});