首页 > 解决方案 > 等到 for 循环没有在节点 js 中完全执行

问题描述

我想在执行我的 for 循环时发送我的响应,但它直接发送而无需在 for 循环中等待

我尝试了不同的方式并在异步函数中应用等待,但它进入下一个

async (request, response) => {
  let imageErr = [],
    succArr = [];
  /** Image processing and send to s3 */

  const OriginalUrl = request.body.images;
  for (const image of OriginalUrl) {
    await createImage.createWebp(image, 'webp', (err, result) => {
      if (err) {
        imageErr.push(err);
      } else {
        succArr.push(result);
        console.log(succArr);
      }
    });
    /** webp */
    await createImage.createJpeg(image, 'jpeg', (err, result) => {
      if (err) {
        imageErr.push(err);
      } else {
        succArr.push(result);
        console.log(succArr);
      }
    });
  }
  if (succArr === 12) responseUtil.success(response, succArr);
  else responseUtil.error(response, 'Fail');
};

我希望在 for 循环完全执行后发送响应

标签: node.jsloopsasync-await

解决方案


似乎您使用了接受回调而不是返回 Promise 的那种框架(这是await正常工作所必需的)。一种方法是将你的调用包装成一个 Promise。尝试这样的事情:

for (const image of OriginalUrl) {
    await new Promise((res, rej) => {
        createImage.createWebp(image, 'webp', (err, result) => {
          if (err) {
            imageErr.push(err);
          } else {
            succArr.push(result);
          }
          res();  // <-- Important
        });
    });

    (...)
}

您也可以使用rej,但您必须将其作为异常捕获。你的选择。

旁注: if (succArr === 12),你的意思是if (succArr.length === 12)?另外,我认为这是为了调试,因为硬编码 literal 绝对不是一个好主意12


推荐阅读