我正在使用 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/