【发布时间】: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的整个概念不知道。 ......又是一个晚上的睡眠。 =/