【问题标题】:Propagating events between JQuery.Deferred objects在 JQuery.Deferred 对象之间传播事件
【发布时间】:2012-04-22 10:47:12
【问题描述】:

如何将一个 JQuery.Deferred() 对象上的所有事件传播到另一个对象?

通过调用其他对象 .rejectWith.resolveWith 来处理 .fail.then .done 是否有更好/更简单/更短的方法? 我假设我不必处理 .done .then,因为当我调用 Reject 或 resolve 时会调用它。

我怀疑也许这可以使用.pipe 来完成,但我不确定如何。

更新:

注意:我还根据@Frédéric Hamidi 的评论修复了上面的一些文本。

我想要达到的目标如下:

我有一个 API 对服务器进行 ajax 调用, 他们会返回 ajax 对象(它本身就是一个 $.Deferred)。

在某些时候,我需要处理没有可用网络的情况(这是针对在移动设备上运行的 phonegap 应用程序)。

我想做的是,在没有网络连接的情况下,我会显示一个对话框,提示用户修复网络问题并点击“重试”。

但在这种情况下,我不会调用 $.ajax,直到用户点击重试,所以我没有 $.Defferred 对象来返回调用 API 开始的函数。

所以我最终明白我可以创建一个新的 $.Defferred 并将其返回,然后在重试按钮的回调中调用 $.ajax 本身,将其设置为“中继”/将延迟事件传播到我只是通过把它作为闭包的一部分来返回。

但我不知道该怎么做。我与.pipe 方法的混淆是因为它的描述说它是:

过滤和/或链接延迟的实用方法

我希望这能让我的问题更清楚。

【问题讨论】:

  • 我不确定我是否正确理解了您的问题。 then() 用第二个参数覆盖 fail(),因此您不必同时使用这两个参数。 pipe() 确实是将延迟调用的结果传递给另一个的方法,但即使在这种情况下,您仍然必须调用resolveWith()rejectWith(),可能还有notifyWith()(或者有其他类似@987654336 @ 这样做)以解决管道延迟调用。你能举个例子说明你想要达到的目标吗?
  • 我读了这个问题,突然间,我意识到我对jQuery.deferred 的整个概念不知道。 ......又是一个晚上的睡眠。 =/

标签: jquery jquery-deferred


【解决方案1】:

如果我理解正确,您只是希望 Deferred 解决/拒绝并使用与您的 ajax 请求完全相同的值进行通知?如果是这样,假设你的 Deferred 对象被称为 defer,下面的代码就可以解决问题:

$.ajax( ... ).done( defer.resolve ).fail( defer.reject ).progress( defer.notify );

之所以有效,是因为 defer.resolve、defer.reject 和 defer.notify 是词法绑定的:上下文(this)和值(参数)被正确传递,因此您只需将 ajax 承诺的状态有效地转发到新的 deferred 中。

【讨论】:

  • 只是为了澄清-当您说词法绑定时,您的意思是对它们的调用将以defer作为上下文执行? (即其中的this 将是defer,因此我不需要使用额外的代理模式)。你怎么知道是这样的?
  • 我写了代码,这就是我知道的 ;) this 不会是 defer,它将是 ajax 给出的任何上下文。但是,由于 resolve、reject 和 notify 都是在闭包中定义的,它们将按预期正确使用 defer 的内部结构。
  • :) 我很荣幸。这在任何地方都有记录吗?我做了类似的事情,但因为我不知道他们在哪里关闭,所以我(再次)使用$.proxy(deffered,'reject') 代理了他们。也可能应该有一个捷径 - 也许.tee(defer)
  • 有博客文章谈论它,但主要文档肯定会受益于更多信息。像您一样代理拒绝将有效地锁定拒绝上下文,请参阅jsfiddle.net/5Q9WH 了解一些说明
  • 感谢您提供了一个很好的例子。说 (onDone) 处理程序在调用 .resolve 的同一上下文中调用是否正确? (正常情况下通常会传递延迟对象,因为 .resolve 或 .reject 通常会直接在其上调用。)
【解决方案2】:

如果您有 2 个延迟对象 d1 和 d2,您可以使用以下命令从 d2 传播到 d1:d2.then(d1.resolve,d1.reject,d1.notify)

一个例子: http://jsfiddle.net/bgrossi/XTJEf/

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2010-09-07
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多