我在工作中遇到问题:我有一段依赖于服务器的安装。我想这样做:当用户删除服务器时,它会遍历安装集合并删除所有相关安装。为此,我使用jQuery' when'函数,据说等待来自服务器的响应,然后转到'then'函数。当只有一个依赖安装时,它可以完美地工作。但是,当有更多安装时会出现问题,因为它在收到JSON响应后立即移动到'then'函数。
问题是:如何让'when'函数等待所有服务器响应?例如。我通过$ .postJSON发送了三个删除请求,并希望在之后移动我得到所有三个响应。如果“何时”不可能,我应该用什么来实现呢?如果它有帮助,我用KnockoutJS维护我的所有实体集合。谢谢!
编辑: 我喜欢这样:
$.when(DeleteDependentInstallations())
.then (function() {
...
});
DeleteDependentInstallations看起来像(伪代码):
Search the installations collection;
If installation.ID equals server.InstallationID
{
Add to dependent installations collection;
}
Repeat until the whole collection is searched;
for (i = 0; i < dependentInstallations.length; i++)
{
DeleteInstallation(dependentInstallations[i]);
}
DeleteInstallations是一个使用$ .postJSON函数的简单函数。
问题是.then函数在第一次JSON响应后立即执行。
答案 0 :(得分:1)
我认为你需要让DeleteDependentInstallations返回一个JQuery deferreds 数组。 $.when允许您向其传递多个参数,以便让它知道它必须等待每个参数。
我不知道你正在做什么的整个背景,但我认为这样的事情可能有用:
function DeleteDependentInstallations() {
var installations = getDependantInstallations();
var promises = [];
for (var i = 0; i < installations.length; i++) {
var installation = installations[i];
promises.push(DeleteInstallation(installation));
}
return promises;
}
function DeleteInstallation(installation) {
//do whatever here, but return the result of $.ajaxPost
return $.post('/foo', installation);
}
现在当你使用那个方法时,它应该等待所有返回的promises完成。
$.when.apply(null, DeleteDependentInstallations()).then(function() { alert('wee!'); });
.apply()是这样我们可以将数组作为参数集传递。
编辑:我在脑海中混淆了“延迟”和承诺。 {$ 3}}是$ .ajax调用返回的内容,Deferreds是$ .when()函数返回的内容。EDIT2:如果.then()的行为不符合您的需求,您可能还想查看promise方法。