0

我正在尝试使用 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/

4

1 回答 1

0

Promise 主体是同步的,尝试使用 setTimeout。了解更多信息

function loop(begin, end, results) {
  setTimeout(() => {
    for (var i = begin; i <= end; i++) {
      console.log(i);
    }
    results();
  }, Math.random() * 1000)
}

function BeginPromise() {
  const p1 = new Promise((resolve, reject) => {
    loop(0, 100, resolve)
  });
  const p2 = new Promise((resolve, reject) => {
    loop(110, 200, resolve)
  });
  const p3 = new Promise((resolve, reject) => {
    loop(210, 300, resolve)
  });
  return Promise.all([p1, p2, p3]).then(() => console.log('done'))
}
于 2020-07-31T13:45:28.433 回答