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

时间:2012-04-22 10:47:13

标签: jquery jquery-deferred

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

是否有更好/更简单/更短的方式,然后通过调用其他对象.fail和{来处理.then .done .rejectWith {1}}? 我假设我不必处理 .resolveWith .done,因为当我调用Reject或者解析时它将被调用。

我怀疑这可能是使用.then完成的,但我不确定如何。

更新:

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

我想要实现的目标如下:

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

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

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

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

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

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

  

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

我觉得这让我的问题更加明确。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

如果你有2个延迟对象,d1和d2,你可以用d d2.then(d1.resolve,d1.reject,d1.notify)

从d2传播到d1

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