4

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

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

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

更新:

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

我想要达到的目标如下:

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

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

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

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

所以我最终明白我可以创建一个新的 $.Defferred 并将其返回,然后在重试按钮的回调中调用 $.ajax 本身,将其设置为“中继”/将延迟事件传播到我刚刚返回的事件将其作为封闭的一部分进行钻孔。

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

过滤和/或链接 Deferreds的实用方法。

我希望这使我的问题更清楚。

4

2 回答 2

1

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

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

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

于 2012-04-22T17:28:40.120 回答
0

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

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

于 2013-08-09T17:54:11.923 回答