等到节点js中的循环未完全执行

时间:2019-08-28 06:24:07

标签: node.js loops async-await

我想在执行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循环完全执行后发送响应

1 个答案:

答案 0 :(得分:2)

似乎您使用的是一种接受回调而不返回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)吗?另外,我认为这是为了调试,因为对字面量12进行硬编码绝对不是一个好主意。