我有一个Backbone模型,可以获取一些数据,处理数据,然后一个函数应该获得处理过的数据。
$.when(model.fetch())
.done(function(){
return model.processData()
})
.then(function(processedData){
//make something with the processed data
})
不幸的是,then
方法会从model.fetch()
调用获得结果,而不是done
函数的返回值
答案 0 :(得分:1)
您必须使用.then
代替.done
。 .then
返回一个新的promise,它使用回调函数返回的值解析。
.done
返回原始的promise对象,并且忽略了回调的返回值。
更多信息可以在documentation(强调我的)中找到:
从jQuery 1.8开始,
deferred.then()
方法返回一个新的promise,它可以通过函数过滤延迟的状态和值,替换现在已弃用的deferred.pipe()
方法。doneFilter
和failFilter
函数会过滤原始延期的已解决/已拒绝状态和值。progressFilter
函数会过滤对原始延迟notify
或notifyWith
方法的所有调用。 这些过滤器函数可以返回一个新值,传递给promise的.done()
或.fail()
回调,或者它们可以返回另一个可观察对象(Deferred,Promise等),将其已解决/拒绝的状态和值传递给promise的回调。如果使用的过滤函数是null
,或未指定,则将使用与原始值相同的值来解析或拒绝承诺。
答案 1 :(得分:1)
要从done
处理程序中拦截,修改或过滤数据以进一步调用,您可以使用{{1方法。
即使在您的示例中,您可以直接用.pipe()
处理程序直接替换.done()
,它也可能看起来像:
.then
当然,如上所述,这并没有太多意义,但无论如何都要考虑$.when(model.fetch())
.pipe(function() {
return model.processData();
})
.then(function(processedData){
//make something with the processed data
});
的可能性。它可以是一个非常方便的工具。
答案 2 :(得分:1)
$.when()
不是必需的。
以下是两种可能性:
model.fetch().then(function() {
return model.processData()
}).then(function(processedData){
//make something with the processed data
});
或者,如果processData()
是同步的:
model.fetch().done(function() {
var foo = model.processData();
//make something with the processed data, foo
});