当前位置: 首页 > 面试题库 >

等待所有的ajax请求都完成

孟安民
2023-03-14
问题内容

我需要等到我所有的ajax函数都完成后,再继续执行。

我的特殊情况是,在提交表单之前,我需要翻译表单中的某些字段。我通过ajax调用将其转换为外部站点。根据表单中的某些值,我需要进行更多或更少的翻译。完成所有翻译后(如果有),我必须使用ajax验证表单,如果表单有效,则提交。

这是我的方法:
首先,我有一个函数发送ajax调用并对接收到的数据进行处理:

function translate(...) {
    $("#ajaxCounter").val(parseInt($("#ajaxCounter").val()) + 1);
    $.ajax({
        ...
        success:function(data) {
            ...
            $("#ajacCounter").val(parseInt($("#ajaxCounter").val()) - 1);
        }
    });

然后,当要提交表单时,我将执行以下代码:

$("#form").submit(function() {
    translatable_fields.each(function() {
        translate(...);
    });
    while (parseInt($("#ajaxCounter").val()) > 0) { null; }
    if (!(this).hasClass('ready')) {
        $.ajax({
            //validation
            success: function(data) {
                if (data['isValid']) {
                    $("#form").addClass('ready');
                    $("#form").submit();
                }
            }
        });
    }
    return true;
});

问题在于whilesubmit函数中的循环永远不会结束。

如果我执行的代码没有while循环,我可以看到ajaxCounter输入在转换函数开始时增加而在转换函数结束时减少。


问题答案:

您可以使用调用deferred返回的对象以更加整洁的方式实现此目的$.ajax。首先,您应该获得translate()返回以下内容的函数deferred

function translate(...){
    return $.ajax({
        // settings...
    });
});

然后,您可以将所有这些承诺放入一个数组中:

var requests = [];
translatable_fields.each(function(){
    requests.push(translate(...));
});

然后,您可以apply将该数组添加到$.when

$.when.apply($, requests).done(function(schemas) {
     console.log("All requests complete");
    // do something...
});


 类似资料:
  • 问题内容: 我如何让一个函数等到所有jQuery Ajax请求都在另一个函数中完成之后? 简而言之,在执行下一个请求之前,我需要等待所有Ajax请求完成。但是如何? 问题答案: jQuery现在为此目的定义了一个when函数。 它接受任意数量的Deferred对象作为参数,并在它们全部解析后执行一个函数。 这意味着,如果您要发起(例如)四个ajax请求,然后在完成后执行操作,则可以执行以下操作:

  • 问题内容: 我有一个页面,根据变量的长度,它可以发出不同数量的请求,然后我只想在所有请求完成后才将数据发送到范围。对于这个项目,我不想使用jQuery,因此请不要在答案中包含jQuery。目前,随着每个请求的完成,数据被发送到作用域,这不是我想要的。 这是我到目前为止的部分代码。 这是我对此表示怀疑的部分,因为某些东西需要作为的参数,但是在Angular的文档中并未提及,我不确定它的含义。 谢谢你

  • 我有一个简单的Java程序,它使用SpringWebClient发送多个请求。每个都返回一个mono,我使用的是response。subscribe()以检查结果。 但是,我的主执行线程在处理所有请求之前完成,除非我添加一个长线程。睡眠()。 对于CompletableFutures,您可以使用:CompletableFuture。allOf(期货)。join(); 有没有办法等待所有单声道的完成

  • 问题内容: 我正在尝试编写一个JS代码,如果给定的数字已经存在于数据库中,它将取消“ btn_submit”按钮.onclick事件。我使用AJAX向数据库查询给定的编号,并确定是否应将数据发送到将上传问题的.php站点。为了确定这一点,我需要numOfRows变量的值,但是因为我在AJAX中将其设置为0,所以validation()函数将在我的AJAX查询完成之前完成,这将导致始终表示给定数字不

  • 问题内容: 在Bash中,可以通过追加在后台执行命令。如何在Python中完成? 问题答案: 我用。我在模块级别创建一个单例线程池,然后用于启动任务。 该命令给了我一个未来,我可以将它无限期地与其他未来添加到列表中,直到我想收集全部或部分结果为止。 出于所有逻辑和理由,是一个THREAD池而不是一个进程池。 示例(只要安装了请求,就可以在Python 2和3中使用): 这些请求将同时执行,因此运行

  • 问题内容: 目前,我正在编写使用ajax进行搜索的webdriver测试。如果在键入搜索内容之后并按Enter键之前添加显式等待,则测试效果很好。 但 失败。我正在使用1个虚拟CPU在ec2上运行测试。我怀疑,即使在发送与搜索相关的GET请求之前,我也按回车键;如果在建议之前按回车键,它将失败。 有没有更好的方法来添加显式等待? 问题答案: 您确实可以添加一个明确的等待,以等待诸如 请参阅:htt