假设我们有一个给定集合的实例(在集合定义中指定了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
,但无效!。
提前谢谢。
答案 0 :(得分:2)
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));
答案 1 :(得分:1)
这个怎么样?
var collection = new SomeCollection(),
async = collection.fetch({
success: done
});
function done(collection, response, options) {
console.log('models are : ', collection.models)
}
答案 2 :(得分:1)
您提供的示例代码的问题在于您没有将done
方法传递给then()
,但它的返回值正如Volodymyr Synytskyi所解释的那样他的回答。
jQuery xhr
对象不知道是否存在backbone.js(例如,基于哪个骨干更新集合/模型在集合/模型中定义的parse
方法)
当请求成功时,将触发其成功回调。无法保证在这些火灾时,骨干网将根据响应创建所有模型。
这就是为什么骨干提供了一个成功的回调,这将在骨干完成其活动后触发。
您可以将全局处理程序作为成功回调传递,该回调将使用collection/model
,response
,options
作为该顺序中的参数进行调用。
function done(collection,response,options){
console.log('models are : ',collection.models)
}
var collection = new SomeCollection(),
collection.fetch({
success: done
});