javascript - 多次重复使用 Deferred

标签 javascript jquery asynchronous jquery-deferred

我正在使用 deferred,因为我需要异步执行多个进程。

为了更清楚,这是我治疗的意义:

  • 处理1:调用提供用户权限的ajax服务
  • 处理 2:调用提供链接和标签的 ajax 服务。

我需要同时调用这两个服务,然后获得两个服务的统一响应,以便根据权限显示链接(我真正的问题是第三个 ajax 服务,但让我们只讨论两个以简化).

首先,我将 deferred 声明为全局变量:

var treatment1 = $.Deferred();
var treatment2 = $.Deferred();

然后,当我需要做这项工作时,我调用带有所需数据的 resolve 方法,以便在全局唯一处理中使用它:

  • 当我的第一个 ajax 服务响应时:treatment1.resolve(responseData1)
  • 当我的第二个 ajax 服务响应时:treatment2.resolve(responseData2)

当 treatment1 和 2 完成时,done 事件被触发:

$.when(treatment1, treatment2).done(function(responseData1,responseData2) {
    DoGlobalTreatmentWithAllResponseData(responseData1,responseData2)
}

我的问题是 deferred 只工作一次。

由于我的网站主要是ajax实现的,所以需要多次触发事件。

用户可以点击一个按钮来搜索用户。然后显示用户列表,并异步调用 ajax 服务。这个操作可以无限重复。

我只是需要一种方法来重复使用延迟但多次的原则。我知道这个问题已经被讨论过了,每个人都说 deferred 不能这样工作。

但是,是否真的不可能重置延迟状态或重置 promise (即使通过实现自定义解决方案,使用 AOP 或其他方式)?

如果不可能,我可以使用什么解决方案?我不想一个接一个地进行处理,但我真的想在所有处理完成后(也就是说,在事件中的最后一个处理完成后)进行全局处理,我想使用 每个服务的responseData

这是我想要自定义的示例代码:http://jsfiddle.net/PLce6/14/

我希望清楚,因为英语不是我的母语。

预先感谢您的帮助。

最佳答案

Deferreds 只能被解决/拒绝一次...但是,我认为问题在于您如何构建代码...

只要你每次都初始化你的 deferred,这样做就没有任何问题...... 我认为问题是这样的:

First, i declare the deferred as global var:

var treatment1 =$.Deferred(); 
var treatment2 = $.Deferred();

相反,您能否尝试在单击按钮时调用的函数中执行此操作

The user can clic a button to search for users

所以有这样一个函数:

function onClick() {
    var treatment1 =$.ajax({url: '/call1'}); 
    var treatment2 = $.ajax({url: '/call2'});
    $.when(treatment1, treatment2).done(function(obj1, obj2) {
            // do whatever else you need
    });
}

现在从你的帖子的其余部分来看,看起来你正在尝试重用 deferreds - 但在那种情况下,你的原始解决方案应该没有问题将 deffereds 保持为全局,因为你的 done 将被调用它们的任何数据解决了。​​

您能否再发布一些代码来帮助解释您正在尝试做什么。

根据我自己在下面的评论进行了更新

根据op的fiddle,他希望能够多次触发依赖 Action 。解决方案是让依赖操作创建新的延迟并将 $.when 连接到自身。在 http://jsfiddle.net/PLce6/15/ 查看更新的 fiddle

// global
var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();

// here's the reset 
function resetDeferreds() {
d1 = $.Deferred();
d2 = $.Deferred();
d3 = $.Deferred();
$.when(d1, d2, d3).done(
    function (responseData1, responseData2, responseData3) {
       DoGlobalTreatmentWithAllResponseData(responseData1, responseData2, responseData3);
    resetDeferreds();
});

// the onclick handlers
function do3() {
d3.resolve('do3 ');
return d3;
}

// the top level $.when
$.when(d1, d2, d3).done(function (responseData1, responseData2, responseData3) {
    DoGlobalTreatmentWithAllResponseData(responseData1, responseData2, responseData3);
    resetDeferreds();
});

关于javascript - 多次重复使用 Deferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19982967/

相关文章:

javascript - 如何将 css 添加到 jquery backstretch?

javascript - 如何从数组中删除对象并保存以供以后使用?

swift - 调用以 TypeAlias 作为参数的函数?

c# - 排队来自 silverlight 的 WCF 调用

javascript - GWT 应用程序未在 IE 中显示

javascript - 如何在 ReasonML 绑定(bind)中包含来自相邻文件的非类型化 JavaScript?

javascript - Cordova OnsenUI 应用程序中的 Google map V3( map 显示在浏览器中,但不在手机上)

jquery - 调用不同类的 fancybox 时保持相同的画廊

javascript - 使用 jQuery 显示隐藏行最接近选定的行

c# - 证明int++不是原子的可靠方法