如何从jQuery延迟传递args

时间:2013-06-13 09:23:40

标签: javascript jquery backbone.js jquery-deferred promise

我有一个Backbone模型,可以获取一些数据,处理数据,然后一个函数应该获得处理过的数据。

$.when(model.fetch())
  .done(function(){
    return model.processData()
  })
  .then(function(processedData){
    //make something with the processed data
  })

不幸的是,then方法会从model.fetch()调用获得结果,而不是done函数的返回值

3 个答案:

答案 0 :(得分:1)

您必须使用.then代替.done.then返回一个新的promise,它使用回调函数返回的值解析。

另一方面,

.done返回原始的promise对象,并且忽略了回调的返回值。

更多信息可以在documentation(强调我的)中找到:

  

从jQuery 1.8开始,deferred.then()方法返回一个新的promise,它可以通过函数过滤延迟的状态和值,替换现在已弃用的deferred.pipe()方法。 doneFilterfailFilter函数会过滤原始延期的已解决/已拒绝状态和值。 progressFilter函数会过滤对原始延迟notifynotifyWith方法的所有调用。 这些过滤器函数可以返回一个新值,传递给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
});