我正在运行一个更新表上记录的循环,但我需要等待所有记录更新才能继续.
我怎样才能让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()
以返回一个承诺,以便它可以以相同的方式工作(虽然它不是必需的,因为您不是要等待该操作完成).
知道何时完成多个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()
以返回一个承诺,以便它可以以相同的方式工作(虽然它不是必需的,因为您不是要等待该操作完成).