如何将一个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:
过滤和/或链延迟的实用方法。
我觉得这让我的问题更加明确。
答案 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)