【问题标题】:Executing Code After Multiple AJAX Calls多次 AJAX 调用后执行代码
【发布时间】:2015-09-26 11:14:58
【问题描述】:

在将其标记为重复之前,我查看了几篇关于 stackoverflow 的文章,但它们似乎没有回答我的问题。

我正在构建一个带有 api 的插件,该插件使用 http 请求进行调用。我有一个执行多次的主循环,其中包含多个不同的 AJAX 请求。完成所有请求后,我需要能够执行代码。

我遇到的主要问题是,在到达 $.when 函数时,包含所有承诺对象的数组要么为空,要么大部分为空,导致代码在一切完成之前触发。

这是基本的、简化的代码大纲:

var xhrs = [];
var xhr = null;

$.each(array, function(index, el) {
    // Step 1
    xhr = ajaxCall.success(function() {
        xhr = ajaxCall2();
        xhrs.push(xhr);
    });
    xhrs.push(xhr);

    // Step 2
    xhr = $.getJSON(params, function() {
        //...stuff...

        // Step 3
        var xhrs2 = [];
        $.each(function() {
            xhr = ajaxCall3();
            xhrs.push(xhr);
            xhrs2.push(xhr);
        });

        // Step 4
        xhr = ajaxCall4().success(function() {
            xhr = ajaxCall5().success(function() {
                //....
            });
            xhrs.push(xhr);
        });
        xhrs.push(xhr);


        // Step 5
        $.when(xhrs2).then(function() {
            $.each(function() {
                xhr = ajaxCall5();
                xhrs.push(xhr);
            });
        });

    });
    xhrs.push(xhr);
});


$.when.apply($, xhrs).then(function() {
    // Run when all ajax calls completed
});

我尝试将它移动到不同的位置,但没有成功。有什么想法吗?

【问题讨论】:

  • 在这里看看 Promise 是如何工作的:learn.jquery.com/code-organization/deferreds/examples
  • 停止将 Promise 推送到回调中的数组,并且不要对所有内容使用相同的变量名。
  • 难道只计算请求的数量是行不通的,并且随着每个请求完成递增一个数字,然后执行 if complete_requests == number_of_requests。我可能过于简化了。
  • @dartanian300 - 对于最近的一个项目,我最终基本上编写了一段代码来检查状态,并且在我达到等于数组长度的循环计数后,我知道它已经完成了并且然后,只有这样我才能前进到下一个功能。祝你好运
  • @Djave 不,我认为这不会起作用,因为它所使用的几乎所有东西都是一个可变数字,并且在几次 AJAX 调用之后我才能得到总数

标签: javascript jquery ajax promise


【解决方案1】:

$.when 函数将每个 XHR 作为参数,然后您可以在whenthen 中响应。每个响应都作为单独的参数传递。

$.when(xhr1, xhr2, xhr3).then(function(resp1, resp2, resp3) {
    // All 3 XHRs finished
});

【讨论】:

  • @dartanian300 不,你没有,你的 then 不使用传递给它的响应
  • @Juan_Mendes_1 我明白你在说什么。但是,我不想写出我所有的代码作为参数。 $.when.apply()... 还能用吗?
  • @dartanian300 很难说,通过在循环内的回调中重用数组,您的代码看起来非常混乱。在 cmets 中遵循 adeneos 的建议
  • @Juan_Mendes 我是使用这么多 AJAX 调用编码的新手,我不确定最佳实践是什么。我使用的唯一数组是 2 个,其中包含 2 组不同的 promise 对象,并且循环对于应用程序是必需的。数组不是一成不变的,只是我尝试执行最后一段代码的方式。
  • 你必须更好地解释解释发生了什么。哪些呼叫需要等待其他呼叫才能进行。您两次拨打相同的电话 (xhr = ajaxCall4().success(function() {xhr=ajaxCall4().success(function() {)。另一个,你的第5步错了,$.when(xhrs2)应该是$.when.apply($, xhr2),就像你最后做的那样。老实说,您需要自己调试它,添加断点并提出一个真实(简化)的示例来说明哪些部分被破坏了,您拥有的伪代码就是无法理解
【解决方案2】:

您是否尝试过使每个请求都同步? jquery 中一个简单的同步请求如下所示:

jQuery.ajax({
     url:    'http://example.com' ,
     success: function(result) {
                      //Do stuff with result
              },
     async:   false
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多