我如何等待多个ajax调用从.each循环完成

 想翻身的咸鱼。。。 发布于 2022-12-26 23:24

我正在运行一个更新表上记录的循环,但我需要等待所有记录更新才能继续.

我怎样才能让jquery等到loopselectedrows函数中的所有调用完成?我读过.deferred和.when,但我不知道如何实现.他们似乎都无法处理一系列的调用,如果我在哪里切换到使用ajax帖子的数组.任何帮助将不胜感激.

这是启动它的按钮:

                click:  function () {

                        // validate all rows
                        var $selectedRows = $('#Table1').jtable('selectedRows');                                             
                        LoopSelectedRows($selectedRows, 'Validate');

///等待所有ajax调用完成//然后继续检查

                        // check for any row with an error 
                        var $ValidatedRows = $('#Table1').jtable('selectedRows');
                        var boolCheck = checkValidatedRows($ValidatedRows);                            


                        // if all records are succesfull then add them
                    // else alert user
                        if (boolCheck == true) {
                            LoopSelectedRows($selectedRows, 'Add');
                        }
                        else {
                            alert("Please correct invalid records and try again");
                        }

                }  

这样做的第一件事是从表中获取所有记录并将它们传递给循环函数.

这是循环函数 -

function LoopSelectedRows(SelectedRecords, actionType) {

    if (SelectedRecords.length > 0) {
        //Show selected rows
        SelectedRecords.each(function () {
            var record = $(this).data('record');

            record.PERSON_NAME = record.PERSON_ID;

            // Actions for loop 

            // Validation Action
            if (actionType == 'Validate') {
                 check = validateRecord(record);
            }

            // call add function   
            if (actionType == 'Add') {
                AddRecordToTable(record);
            }
        })
    };

}

这个循环现在可以验证或添加记录我只担心验证功能

这是验证功能:

function validateRecord(dataRecord) {                

    $.ajax({
        url: "./ValidateAddRecord",
        type: 'POST',
        contentType: 'application/json',
        dataType: 'json',
        data: JSON.stringify(dataRecord),
        success: function (data) {
            if (data.Result == "OK") {

                // update record with message 
                $('#table1').jtable('updateRecord', { record: data.Record });

            }
            else {
                // display error
                alert(data.Message);
            }
        }
    });        
}

jfriend00.. 6

知道何时完成多个ajax调用的一种相当干净的方法是使用promises和jQuery $.when().所有ajax调用完成后,这将给你一个回调.您需要对代码进行一些重组才能使用它.

首先,您$.ajax()validateRecord()以下方面返回承诺:

function validateRecord(dataRecord) {                

    return $.ajax({
        url: "./ValidateAddRecord",
        type: 'POST',
        contentType: 'application/json',
        dataType: 'json',
        data: JSON.stringify(dataRecord),
        success: function (data) {
            if (data.Result == "OK") {

                // update record with message 
                $('#table1').jtable('updateRecord', { record: data.Record });

            }
            else {
                // display error
                alert(data.Message);
            }
        }
    });        
}

然后,您收集所有承诺LoopSelectedRows()并使用`$ .when()返回主承诺:

function LoopSelectedRows(SelectedRecords, actionType) {
    var promises = [];

    if (SelectedRecords.length > 0) {
        //Show selected rows
        SelectedRecords.each(function () {
            var record = $(this).data('record');

            record.PERSON_NAME = record.PERSON_ID;

            // Actions for loop 

            // Validation Action
            if (actionType == 'Validate') {
                 promises.push(validateRecord(record));
            }

            // call add function   
            if (actionType == 'Add') {
                promises.push(AddRecordToTable(record));
            }
        })
    };
    // return master promise
    return $.when.apply($, promises);
}

然后,您可以使用最终的承诺来了解所有事情何时完成.

click:  function () {
    // validate all rows
    var $selectedRows = $('#Table1').jtable('selectedRows');                                             
    LoopSelectedRows($selectedRows, 'Validate').then(function() {
         // all the ajax calls in LoopSelectRows are done now

         // check for any row with an error 
         var $ValidatedRows = $('#Table1').jtable('selectedRows');
         var boolCheck = checkValidatedRows($ValidatedRows);                            

         // if all records are succesfull then add them
         // else alert user
         if (boolCheck == true) {
             LoopSelectedRows($selectedRows, 'Add');
         } else {
             alert("Please correct invalid records and try again");
         }
    });

仅供参考,您可能还想更改AddRecordToTable()以返回一个承诺,以便它可以以相同的方式工作(虽然它不是必需的,因为您不是要等待该操作完成).

1 个回答
  • 知道何时完成多个ajax调用的一种相当干净的方法是使用promises和jQuery $.when().所有ajax调用完成后,这将给你一个回调.您需要对代码进行一些重组才能使用它.

    首先,您$.ajax()validateRecord()以下方面返回承诺:

    function validateRecord(dataRecord) {                
    
        return $.ajax({
            url: "./ValidateAddRecord",
            type: 'POST',
            contentType: 'application/json',
            dataType: 'json',
            data: JSON.stringify(dataRecord),
            success: function (data) {
                if (data.Result == "OK") {
    
                    // update record with message 
                    $('#table1').jtable('updateRecord', { record: data.Record });
    
                }
                else {
                    // display error
                    alert(data.Message);
                }
            }
        });        
    }
    

    然后,您收集所有承诺LoopSelectedRows()并使用`$ .when()返回主承诺:

    function LoopSelectedRows(SelectedRecords, actionType) {
        var promises = [];
    
        if (SelectedRecords.length > 0) {
            //Show selected rows
            SelectedRecords.each(function () {
                var record = $(this).data('record');
    
                record.PERSON_NAME = record.PERSON_ID;
    
                // Actions for loop 
    
                // Validation Action
                if (actionType == 'Validate') {
                     promises.push(validateRecord(record));
                }
    
                // call add function   
                if (actionType == 'Add') {
                    promises.push(AddRecordToTable(record));
                }
            })
        };
        // return master promise
        return $.when.apply($, promises);
    }
    

    然后,您可以使用最终的承诺来了解所有事情何时完成.

    click:  function () {
        // validate all rows
        var $selectedRows = $('#Table1').jtable('selectedRows');                                             
        LoopSelectedRows($selectedRows, 'Validate').then(function() {
             // all the ajax calls in LoopSelectRows are done now
    
             // check for any row with an error 
             var $ValidatedRows = $('#Table1').jtable('selectedRows');
             var boolCheck = checkValidatedRows($ValidatedRows);                            
    
             // if all records are succesfull then add them
             // else alert user
             if (boolCheck == true) {
                 LoopSelectedRows($selectedRows, 'Add');
             } else {
                 alert("Please correct invalid records and try again");
             }
        });
    

    仅供参考,您可能还想更改AddRecordToTable()以返回一个承诺,以便它可以以相同的方式工作(虽然它不是必需的,因为您不是要等待该操作完成).

    2022-12-26 23:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有