退出/取消其余的 Promise 处理

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

我正在阅读一些帖子并在面试中遇到类似的问题。假设代码片段如下所示:

const newPromise = new Promise((resolve, reject) => reject());

newPromise
  .then(() => { console.log("1") })
  .catch((error) => { console.log("2"); })
  .then(() => { 
      console.log("3"); 
      throw new Error; 
  })
  .then(() => console.log("4"))
  .catch(() => console.log("5"))
  .catch(() => console.log("6"))

所以看到这个,我的第一个想法是,既然 Promise“立即”拒绝,它会寻找最接近的

catch
,处理“错误”并退出 Promise 循环。

事实证明,在

catch
方法之后可能会发生两种情况:

  1. 如果它处理错误或者您调用
    Promise.resolve()
    ,那么 Promise 会切换回已完成状态,并且它将查找第一个
    then
    方法。
  2. 如果它重新抛出错误或者你调用
    Promise.reject()
    ,它将传播错误,promise 保持在拒绝状态,并且它将寻找最接近的
    catch
    方法。

所以我的问题是 - 如果我们最终陷入这种“回调地狱”场景,我们如何才能简单地从

then
catch
回调中退出/终止 Promise 进程?

我尝试过的:

不返回任何内容,它会进入fulfill状态,这意味着最近的then被执行。

然后我尝试简单地返回任何值,这会导致 Promise 进入“履行”状态。

然后我尝试了

Promise.reject()
Promise.resolve()
- 分别与上面的结果相同。

javascript
1个回答
0
投票

我的第一个想法是,由于 Promise“立即”拒绝,它将寻找最接近的 catch,处理“错误”并退出 Promise 循环。

执行不能直接跳转到最近的

catch
方法回调。原始 Promise 的拒绝必须经过整个链,即,如果在原始 Promise 和 Promise 链中的第一个
then
方法调用之间有
catch
方法调用,则每个
then
返回的 Promise方法将被一个接一个地拒绝,拒绝原因与最初的承诺相同。

如果它处理了错误或者你调用 Promise.resolve(),那么 Promise 会切换回已完成状态

Promise 状态一旦确定就不能更改,即履行或拒绝。如果您在

catch
方法回调中处理错误,即您没有抛出错误或被拒绝的 Promise,或者最终将被拒绝的 Promise,那么
catch
方法返回的 Promise 将被实现。

注意,原来的承诺仍然被拒绝。这是

catch
方法的承诺得以实现。

如果它重新抛出错误或者你调用 Promise.reject() ,它会传播错误,promise 保持在拒绝状态,并且它将寻找最接近的 catch 方法。

在这种情况下,

catch
方法返回的promise将被拒绝。原来的承诺不受影响。无论您在
catch
方法回调中执行什么操作,它都将保持其状态。

所以我的问题是 - 如果我们最终陷入“回调地狱”场景,我们如何简单地从 then 退出/终止 Promise 进程或捕获回调?

一般来说,您在 Promise 链的末尾有

catch
方法调用,但是如果您在 Promise 链之间有一个链调用,那么您很可能希望处理拒绝并继续 Promise 链。

防止执行在

then
方法调用之后链接的
catch
方法回调的唯一方法是拒绝
catch
方法返回的 Promise。

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