为什么下面的代码会先解析而不是拒绝?

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

[Promise.reject(42), Promise.resolve(4)].forEach((item, i) => {
  Promise.resolve(item)
    .then(() => console.log("resolve", i))
    .catch(() => console.log("reject", i));
});

预期输出:

reject 0
resolve 1

实际产量:

resolve 1
reject 0
javascript promise
1个回答
0
投票

您正在构建两条承诺链,您看到结果的原因是拒绝案例的日志在链中比解决案例的日志深一层。

由于两个顶级承诺已经解决,承诺链将大致在同一时间开始解开。因此,它不会先沿着一条链一直向下,然后沿着第二条链一直向下。相反,它会在它们之间曲折:reject1 ->resolve1 ->reject2 ->resolve3 ->reject3 ->resolve3。

因此,它可能会首先在每一层查看被拒绝的堆栈,但在到达具有 console.log 的

.catch
之前,它必须更深入。

如果您进行了以下更改,那么它将按您的预期工作(

.then
需要第二个参数来处理 catch 情况):

[Promise.reject(42), Promise.resolve(4)].forEach((item, i) => {
  Promise.resolve(item)
    .then(
      () => console.log("resolve", i),
      () => console.log("reject", i)
    )
});

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