繁体   English   中英

如何在新表达式节点 v14.4.0 “for await ... of”中捕获被拒绝的 promise

[英]How to catch a rejected promise in a new expression node v14.4.0 “for await … of”

我模拟了 3 个承诺 - 两个已解决,一个被拒绝,包装了一个 try-catch function,但我仍然在控制台中收到警告:(节点:4159)UnhandledPromiseRejectionWarning:Unhandled89DEEBZF795D279。

    const emulate = (id, ms) =>
      new Promise((resolve, reject) => {
        if (ms > 1500) reject(id);
        setTimeout(() => {
          resolve(id);
        }, ms);
      });

    const promises = [
      emulate(1, 500),
      emulate(2, 1000),
      emulate(3, 2000)
    ];

    async function stepByStepResolve() {
      try {
        for await (const promise of promises)
          console.log(promise);
      } catch (e) {
        console.log('Err:', e);
      }
    }

    stepByStepResolve();

当您在promises数组中调用 emulate emulate(3, 2000)时,会创建一个 promise,并且会在事件循环的下一阶段被拒绝,除非您在此之前正在收听并处理它。 现在,在for loop中,您正在按顺序收听所有 3 个 Promise,并且由于emulate(3, 2000)是最后收听的,因此在您迭代它时它已经被拒绝了。

我可以为此提出两种解决方案:

解决方案 1 :只需将emulate(3, 2000)作为数组中的第一个元素

let promises = [
  emulate(3, 2000),
  emulate(1, 500),
  emulate(2, 1000),
];

这将允许它被倾听,并在它被拒绝之前被捕获。

解决方案 2 (这更像是一个建议):使用生成器而不是数组,如下所示:

function* promisesGenerator() {
  yield emulate(3, 2000);
  yield emulate(1, 500);
  yield emulate(2, 1000);
}

async function stepByStepResolve() {
  try {
    for await (const promise of promisesGenerator())
      console.log(promise);
  } catch (e) {
    console.log('Err:', e);
  }
}

stepByStepResolve();

这将防止在for loop之前创建 Promise,并在您遍历生成器时一一创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM