【问题标题】:Can we use multiple then in single promise returned function? [duplicate]我们可以在单个 promise 返回函数中使用多个 then 吗? [复制]
【发布时间】:2022-01-05 16:25:08
【问题描述】:

以下是我的代码 -

const fn = () => new Promise((resolve, reject) => reject());
let promise = fn();

promise
.then(() => console.log('Success 1'))
.then(() => console.log('Success 2'))
.then(() => console.log('Success 3'))
.catch(() => console.log('Error 1'))
.then(() => console.log('Success 4'))
.catch(() => console.log('Error 2'))
.then(() => console.log('Success 5'))
.catch(() => console.log('Error 3'))

返回 -

"Error 1"
"Success 4"
"Success 5"

我的问题是,当一个承诺通过输出Error 1 解决时,为什么Success 4Success 5 会登录控制台?

【问题讨论】:

  • 因为catch也返回一个promise
  • 有人有一个非常好的欺骗目标吗?我敢肯定有一个,但我发现的不同之处足以令人困惑。
  • @T.J.Crowder 这个怎么样? Executing then after catch
  • @JeffBowman - 完美!

标签: javascript ecmascript-6 promise callback


【解决方案1】:

关于thencatch 的关键之一是他们返回了一个新的承诺。这个新的承诺是基于 A) 你调用 thencatch 的承诺会发生什么,以及 B) 你提供的处理函数内部会发生什么(它返回什么,或者它抛出的错误)。

在您的代码中,您通过catch 捕获了拒绝,然后您从中返回undefined(因为console.log 返回undefined,并且您正在返回它的返回值)——用值undefined 履行创建的承诺catch(而不是拒绝它),所以你连接到then 的履行处理程序被调用。该处理程序还返回undefined,履行其承诺,因此下一个then 处理程序被调用。

catch 处理函数中,如果你想拒绝 catch 创建的承诺,要么抛出错误,要么返回被/将被拒绝的承诺。

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多