【问题标题】:Is it a chain of promises i need这是我需要的一连串承诺吗
【发布时间】:2023-03-09 04:20:01
【问题描述】:

我有一个函数,我需要在几个 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) }
    });
}

【问题讨论】:

    标签: javascript jquery ajax promise q


    【解决方案1】:

    你可以用这个:

    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 函数需要返回 this 才能使该方案起作用。

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

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

    这是一个工作示例: http://jsfiddle.net/vmw8H/

    一些参考:

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

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

    【讨论】:

    • 无法通过查看文档来判断,这种方法是否确保 Call1 在 Call2 之前触发并完成等等(基本上使调用同步)?还是 for 循环遍历并尝试异步调用所有调用并等待所有调用返回成功状态?
    • @FeistyMango 我想我明白你在问什么,答案是肯定的(对你的第一个问题)。在if 语句中,应该启动$.ajax 调用(和returned)。然后,使用$.when,它将它们组合成一个大Promise。当所有包含的$.ajax 调用完成时(无论是resolved 还是rejected),都会执行.always() 方法。
    • @FeistyMango 由于 jQuery Promises 具有特殊的结构,因此不需要循环。在内部,当 AJAX 请求返回时,特定的 Promise.resolve()d 或 .reject()ed。 $.when 将等待所有包含在执行 .always()
    • 添加了一个示例 ajax 调用来澄清。你说 .ajax 调用返回一个承诺,我的全局回调需要在每个 ajax 调用的回调方法完成后运行,而不是在每个 ajax 调用完成后运行。
    • @Tim 我用试图模仿您的代码的 jsFiddle 示例更新了我的答案。请注意如何进行 3 次调用(并成功完成),然后.always() 回调触发一次。这就是你要找的东西吗?
    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多