我正在尝试使用 Promise.all 异步运行一个函数 4 次(使用不同的参数)。此代码段运行,但它只会按顺序同步运行每个“loopGridValidate”函数。我已经用这个https://www.javascripttutorial.net/es6/javascript-promise-all/教程中的逻辑替换了 loopGridValidate 函数,并且 Promise.all 返回了预期的内容。我不确定我错过了什么......循环函数是异步的,所有内容都在 promise all 中正确设置(我还将新的 promise 拆分为 'const p1 = new Promise' 并具有相同的效果下面的代码片段)
function validateCells() {
var grid = $("#NonStartUpGrid").data("kendoGrid");
var rows = grid.tbody.find("tr"); //rows from excel sheet
var valid = true;
var errorCount = 0;
var rowSec1 = Math.floor(rows.length * .25)
var rowSec2 = Math.floor(rows.length * .5)
var rowSec3 = Math.floor(rows.length * .75)
Promise.all([new Promise((resolve, reject) => { resolve(loopGridValidate(rows, grid, errorCount, 0, rowSec1, valid)); })
, new Promise((resolve, reject) => { resolve(loopGridValidate(rows, grid, errorCount, rowSec1 + 1, rowSec2, valid)); })
, new Promise((resolve, reject) => { resolve(loopGridValidate(rows, grid, errorCount, rowSec2 + 1, rowSec3, valid)); })
, new Promise((resolve, reject) => { resolve(loopGridValidate(rows, grid, errorCount, rowSec3 + 1, rows.length - 1, valid)); })
]).then(results => { const total = results.reduce((a, b) => a + b, 0) });
return errorCount;
};
async function loopGridValidate(rows, grid, errorCount, begin, end, valid) {
console.log(begin);
for (var i = begin; i <= end; i++) {
var rowModel = grid.dataItem(rows[i]);
if (rowModel) {
console.log(i);
var colCells = $(rows[i]).find("td[role=gridcell]");
for (var j = 0; j < colCells.length; j++) {
//custom logic
}
}
}
scrollToTop(grid)
if (valid) {
$("#SubmitGrid").prop("disabled", "");
}
$("#loading").prop("hidden", "hidden");
return errorCount;
}
这是一个小提琴,展示了我所说的正在发生的事情的基本示例。如果单击您将在控制台中看到的按钮,则函数将同步运行,而不是异步运行(i 值将被混合而不是按顺序)https://jsfiddle.net/tap16fbo/