【问题标题】:How to pass a args from a jQuery defered如何从 jQuery deferred 传递参数
【发布时间】:2013-06-13 17:43:58
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    即使在您的示例中,您可以直接用您的 .then 处理程序完全替换 .done(),它也可能看起来像:

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

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

    【讨论】:

    • .pipe 现在已被弃用。此行为已添加到 .then
    • @FelixKling 我不知道它被宣布为弃用,我会读一读。
    • 关于它的讨论很长,afaik。这样做是为了更符合最初的 CommonJS Promises/A 提案:wiki.commonjs.org/wiki/Promises/A
    • 我刚刚阅读了关于它的 wiki 和 jQuery 文档,我不得不说,我一点也不喜欢它。 .then 现在似乎是 IMO 超载的方式,也不是很方便。无论如何.pipe迟早会消失,所以我们必须处理它。
    • 一旦你对.then()有了心意,它就会成为你最好的朋友。
    【解决方案3】:

    $.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
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多