当前位置: 首页 > 知识库问答 >
问题:

如何进行多个ajax调用,并在每次调用后更新用户界面

后阳炎
2023-03-14

我正在为一些大型查询制作一个脚本,并避免在php端超时,加上给用户一些输入,我试图在jquery上做大部分。

所以它的工作原理是这样的:首先,用户在一个select上选择一条记录。当他单击按钮时,我接到一个ajax调用,从json格式的记录中获取所需的详细信息。

通过响应,我得到了一个循环,对第一次调用的每个结果进行ajax调用。

如果我将async设置为false,它会工作,但是浏览器会死机,因为有几个ajax调用。那么有没有办法在关闭async的情况下更新用户界面呢?

我的意思是,当我在一个循环中进行ajax调用时,我需要将async设置为off,这对我来说没有任何意义。它可以同时进行几个调用,我对此没意见,但是为什么它不获取循环中的当前索引,除非我将async设置为false?它一直使用第一个索引。

    $("#button_copy").live('click', function(){
        $('#button_copy').attr("disabled", true);
        id = $('#select').val();
        $.ajax({
            type: "POST",
            url: "query1.php",
            dataType: 'json',
            async:false,
            cache: false,
            data: 'id=' + id,
            success: function( data ) {
                var total1 = data['records'].length;
                $("#console").append('Total query 1: ' + total1 + '<br />');
                for (var i in data['records']) {
                    $.ajax({
                        type: "POST",
                        url: "query2.php",
                        dataType: 'json',
                        async:false,
                        cache: false,
                        data: 'id=' + data['records'][i].id,
                        success: function( data2 ) {
                            var total2 = data2['records2'].length;
                            $("#console").append('Total of query 2 from ' + data['records'][i].person + ': ' + total2 + '<br />');
                        },
                        error: function(data2) {
                            console.log(data2);
                        }
                    });
                    var percentprogress1 = (i / total1) * 10000;
                    $('#progressbar1').css('width',percentprogress1 + '%');
                }
            },
            error: function(data) {
                console.log(data);
            }
        });
    });

共有2个答案

蔚俊人
2023-03-14

我自己也遇到了类似的问题。我在while循环中运行了一系列ajax请求。有些调用没有被发出!这要了我的命!!我的结论是我的浏览器——谷歌Chrome——忽略了“重复”请求。

看看这段伪代码:

while (i < ajaxCallArray.length) {
    currentAjaxObject = ajaxCallArray[i];
    ajaxPost = $.post(currentAjaxObject.url, function(data) {
    //response data needs to go into a function such that each request gets its own "data" variable created.otherwise it just overwrites data!!
    processAjaxResponse(data, currentAjaxObject);
        },"json");
i++;
}

如果阿贾克斯呼叫阵列[0].url =“http://www.google.com”阿贾克斯呼叫阵列[1].url =“http://www.google.com”,而阿贾克斯呼叫阵列[2].url=“http://www.google.com”,浏览器实际上只会进行1次调用!!

解决方案:您必须执行类似于ajaxCallArray[0]的操作。url=“http://www.google.com?count=0“ajaxCallArray[1]。url=”http://www.google.com?count=0“ajaxCallArray[2]。url=”http://www.google.com?count=0“即使您不使用这些url参数,也只需将它们区分开来。这样,浏览器将处理所有调用,即使它们立即完成。

希望这有帮助!!

葛念
2023-03-14

您会遇到问题,因为您试图在回调中使用< code>i,但是当回调被调用时,< code>i不再具有其原始值。您也不应该将< code >用于...in on array -仅在对象上。

我建议不要使用任何类型的 for 循环,而是在完成前一个 AJAX 调用时触发每个连续的 AJAX 调用:

$.ajax(...).done(function(data) {

    var all = data.records;
    (function next() {
        var record = all.shift();
        if (record) {
            $.post(...).done(next, function(res) {
                // process inner result
                // update UI, etc
                ...
            });
        }
    })();       // invoke immediately

});

注意,我在两个AJAX调用中使用了“deferred”语法,而不是传递success:处理程序。

在“伪递归”循环中,注意到我使用了。完成(next,…),它允许循环与当前调用结果的处理并行启动下一个AJAX调用。

 类似资料:
  • 我在ajax上卡住了,我有第一个选择框,这列出了所有国家的发送者,我也有第二个选择框,这也列出了国家的接收者。我使用ajax追加国家,但现在的问题是,第二个选择框没有填充。 我用php函数调用国家 我的路线 现在我的ajax 我的选择框如下所示 对于发件人: 那么对于接收方: 现在只有发送方的选择框总是被填充,而接收方不会。请告诉我如何使用AJAX填充两个选择框。 null

  • 问题内容: 我正在使用以下代码通过AJAX提交表单: 背景 我的PHP处理程序执行各种任务,然后发回响应。然后,我可以在成功或错误函数中执行某些操作。 我的问题 当用户双击表单的“提交”按钮时,将发生两次AJAX调用,这将导致我的PHP处理程序中的代码执行两次。 我的问题 如果用户双击提交,如何避免我的代码执行两次? 问题答案: 当AJAX调用再次出现时,请先禁用首次单击的“提交”按钮,然后重新启

  • 问题内容: 当图表第一次使用初始默认Ajax答复加载时,它可以正常工作。如果我添加console.log(chart_data),我会看到默认数据,然后在提交后我会看到新数据。唯一的问题是图表不会再次绘制。我知道drawChart函数不会第二次运行,我只是不知道为什么。我假设是的话,图表将重绘。抱歉,答案很明显。我对jQuery / Ajax非常陌生。 任何帮助,将不胜感激。谢谢! 问题答案: 您

  • 问题内容: 我有一个php脚本,只生成到客户端的日志。 当我回声时,我希望将其即时传输到客户端。 (因为在处理脚本时,页面为空白) 我已经使用和玩过了,但是它们没有用。 最好的解决方案是什么? PS:在通话结束时冲水有点脏… 编辑:答案都行不通,PHP还是Apache错误? 问题答案: 编辑: 我在阅读手册页上的评论时遇到一个错误,该错误指出 不能正常工作 ,以下是解决方法: 如果这不起作用,那么

  • 问题内容: 我有以下UPDATE语句: 在此示例中,该函数每行被调用三次,这是错误的-我希望该函数的每行仅被调用一次。 我正在使用PostgreSQL 8.4数据库。如何编写正确的更新? 我已经尝试过这样的事情: 但这没有用,因为整个更新语句仅被调用了 一次 。 问题答案: 您是否尝试过Postgres的非标准条款?我想这会起作用 请注意,我强制在子选择内每个记录仅被调用一次。然后,我将自我加入并

  • 问题内容: 我想在我的页面上有一个链接(是否有更好的选择?),单击该链接将发出Ajax请求。(单击链接后,我想更新数据库中的字段。) 实现此目的的最简单方法是什么? 你能推荐我一些教程吗? 问题答案: 真的很简单。在您看来,有这样的链接/按钮。重要的一点是 :remote = > true 要么 显然,您必须获取update_thingy_path才能正常解决某些问题。区别在于渲染时将渲染 .js