0

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

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

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

4

3 回答 3

1

您必须使用.then而不是.done. .then返回一个新的 Promise,该 Promise 使用回调函数返回的值解析。

.done另一方面,返回原始的承诺对象,回调的返回值被简单地忽略。

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

从 jQuery 1.8 开始,该deferred.then()方法返回一个新的 Promise,它可以通过函数过滤 deferred 的状态和值,替换现在已弃用的deferred.pipe()方法。doneFilterandfailFilter函数过滤原始 deferred 的已解决/已拒绝状态和值。该progressFilter函数过滤对原始延迟notifynotifyWith方法的任何调用。这些过滤器函数可以返回一个新值以传递给Promise.done().fail()回调,或者它们可以返回另一个可观察对象(Deferred、Promise 等),它将其已解决/拒绝状态和值传递给 Promise 的回调。如果使用的过滤器功能是null, 或未指定,promise 将被解析或拒绝,并使用与原始值相同的值。

于 2013-06-13T09:28:12.300 回答
1

拦截修改过滤来自done处理程序的数据以进一步调用,您可以使用该.pipe()方法。

即使在您的示例中,您可以直接将.done(), 完全替换为您的.then处理程序,它也可能如下所示:

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

当然,如上所述,这并没有太大的意义,但请考虑.pipe()无论如何的可能性。它可以是一个非常方便的工具。

于 2013-06-13T09:30:44.980 回答
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
});
于 2013-06-13T09:33:14.690 回答