如何在具有更多postJSON查询的函数时使用jQuery?

时间:2012-08-27 18:05:23

标签: javascript jquery json knockout.js

我在工作中遇到问题:我有一段依赖于服务器的安装。我想这样做:当用户删除服务器时,它会遍历安装集合并删除所有相关安装。为此,我使用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响应后立即执行。

1 个答案:

答案 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方法。