当我使用“for wait”循环时,为什么块 catch() 没有捕获错误

问题描述 投票:0回答:1

promiseAll 函数中的块 catch(err){} 不会捕获错误。

const promiseAll = async (promises) => {
  const result = [];

  try {
    for await (let element of promises) {
      result.push(element);
    }
  } catch (err) {
    throw err;
  }

  return result;
};

const result = promiseAll([
  Promise.resolve(1),
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(3);
    }, 3000);
  }),
  Promise.resolve(2),
  Promise.reject(2),
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(3);
    }, 1000);
  }),
]);

result
  .then((data) => console.log("Data", data))
  .catch((err) => console.log("err", err));

promiseAll 函数中的块 catch(err){} 不会捕获错误。 对我来说有趣的是为什么我无法捕获块捕获中的错误。解决办法是什么?

javascript async-await cycle
1个回答
0
投票

因为您没有将任何错误处理

catch
回调附加到您的错误,并且您允许触发额外的事件循环(刻度),Chrome 会将其视为未经处理的错误。

一种解决方案是在

catch
之前简单地将
await
回调附加到所有元素。

下面的示例,唯一的缺点是它只会报告它找到的第一个错误,但如果需要,您也可以处理该问题。

const promiseAll = async (promises) => {
  const result = [];
  //were awaiting promises, let attach dummy catch
  //so that next tick doesn't detect error as unhandled.
  for (let element of promises) element.catch(e => {});
  //Don't worry the error we just swallowed above
  //will resurface during the await
  for (let element of promises) {
    result.push(await element);
  }
  return result;
};

const result = promiseAll([
  Promise.resolve(1),
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(3);
    }, 3000);
  }),
  Promise.resolve(2),
  Promise.reject(2),
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(3);
    }, 1000);
  }),
]);

result
  .then((data) => console.log("Data", data))
  .catch((err) => console.log("err", err));

© www.soinside.com 2019 - 2024. All rights reserved.