javascript 在Promise中完成for循环之前返回Resolve

pdkcd3nj  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(152)

我很困惑为什么在for循环完成之前调用return resolve({ status: true, data: newIDs });

    • 代码**
createPallet: (data) => {
    return new Promise(async (resolve, reject) => {
      const newIDs = [];
      try {
        for (const record of data) {
          mysqlConnection.beginTransaction();
          mysqlConnection.query(
            "INSERT INTO ...",
            [record.BatchId, record.PalletNumber, record.PrimaryWeightId],
            async (error, results) => {
              if (error) {
                return reject(error);
              }

              // Create pallet sku record
              await PalletSkusService.createPalletSku(
                ...
              );

              console.log(results.insertId);
              newIDs.push(results.insertId);
            }
          );
        }
        return resolve({ status: true, data: newIDs });
      } catch (error) {
        mysqlConnection.rollback();
        return reject(error);
      }
    });
  },
    • 期望**

我希望for循环获取所有新插入的id并将它们存储到newIDs数组中,一旦完成,我就可以返回一个包含数据的resolve。
但是,我不太明白的是-为什么在for循环完成之前运行resolve?
在这种情况下,正确的方法是什么?

qnzebej0

qnzebej01#

mysqlConnection.query正在立即返回,而不是等待数据返回。我不知道您为此使用了什么库,但您希望找到基于promise的方法来完成此操作。然后,修改循环,使其在解析之前等待promise数组完成。

async createPallet(data) {
  try {
    // modified loop
    const newIDs = await Promise.all(data.map((record) => {
      mysqlConnection.beginTransaction();
      // this is a best guess for how the a promise-style query would look
      const await result = await mysqlConnection.query(
        "INSERT INTO ...",
        [record.BatchId, record.PalletNumber, record.PrimaryWeightId]
      );

      // Create pallet sku record
      await PalletSkusService.createPalletSku(
        ...
      );

      console.log(results.insertId);
      return results.insertId;
    }));

    return { status: true, data: newIDs };
  } catch (error) {
    mysqlConnection.rollback();
    throw error;
  }
},

相关问题