这是我需要的一系列承诺吗?

时间:2013-04-09 07:04:46

标签: javascript jquery ajax promise q

我有一个函数,我需要在几个Ajax调用完成后运行。每个AJAX调用目前一个接一个地调用,并且当前在各自的回调中工作。这是一个承诺链的候选者,因为每个ajax调用仅在其各自的测试为真时运行吗?并且我不一定需要这些调用是串行运行的,因为我在最后得到一个回调(当满足要运行的条件的所有Ajax调用完成它们各自的回调时)。

if(MyTest1){
  RunMyAjaxCall1(param1,param2,successAjaxCallback1,failureAjaxCallback1);
}
if(MyTest2){
  RunMyAjaxCall2(param1,param2,successAjaxCallback2,failureAjaxCallback2);
}
if(MyTest3){
  RunMyAjaxCall3(param1,param2,successAjaxCallback3,failureAjaxCallback3);
}
if(MyTest4){
  RunMyAjaxCall4(param1,param2,successAjaxCallback4,failureAjaxCallback4);
}

AJAX呼叫示例

RunMyAjaxCall1 = function (param1,param2, successCallback, failureCallback) {
    $.ajax({
        type: "POST",
        datatype: 'json',
        url: "/WebServices/GlobalWebService.asmx/webservicemethod1",
        data: JSON.stringify({ param1: param1, param2: param2 }),
        contentType: 'application/json; charset=utf-8',
        success: function (data) { successCallback(data.d); },
        error: function (data) { failureCallback(data.d) }
    });
}

1 个答案:

答案 0 :(得分:6)

你可以用这个:

var requests = [];
if (MyTest1) {
    requests.push(RunMyAjaxCall1(param1,param2,successAjaxCallback1,failureAjaxCallback1));
}
// ...continue with other if statements

$.when.apply(null, requests).always(function () {
    // All handlers used are done (either succeeded or failed)
});

由于您说您正在进行AJAX调用,我假设您正在使用$.ajax。调用$.ajax返回的值为PromiseRunMyAjaxCallX函数需要返回此函数才能使此方案有效。

使用requests可以动态地对请求进行分组。 if语句确定执行和包含哪些语句。

使用$.when(传递requests作为参数)会创建一个新的Promise,包含您确定应包含的所有请求。然后使用.always()方法,它将在所有包含的请求完成后运行。

以下是其工作示例: http://jsfiddle.net/vmw8H/

一些参考:

http://api.jquery.com/jQuery.when/

http://api.jquery.com/deferred.always/