在JQuery.Deferred对象之间传播事件

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

是否有更好/更简单/更短的方式然后通过调用其他对象.rejectWith.resolveWith来处理.fail.fail .done ? 我假设我不必处理.done然后当我调用Reject或resolve时它将被调用。

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

更新:

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

我想要实现的目标如下:

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

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

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

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

所以我最终明白我可以创建一个新的$ .Defferred并返回它并在重试按钮的回调上调用$ .ajax本身设置它“中继”/将defferred事件传播到我刚刚返回的那个将它作为封闭的一部分。

但我不确定如何做到这一点。 我与.pipe方法的混淆是因为它的描述是:

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

我觉得这让我的问题更清楚了。

如果我理解正确,您只是希望延期解决/拒绝并使用与您的ajax请求完全相同的值进行通知? 如果是这样,假设您的Deferred对象被称为延迟,则以下代码将执行此操作:

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

它的工作原理是因为defer.resolve,defer.reject和defer.notify是词法绑定的:上下文(this)和值(参数)被正确传递,所以你只需要将ajax promise的状态转发到新的deferred中。

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

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