【问题标题】:(Javascript) why the catch doesn't catch the rejection?(Javascript)为什么捕获没有捕获拒绝?
【发布时间】:2018-12-07 07:12:19
【问题描述】:

以下是承诺链代码:

new Promise(function(resolve, reject) {
  console.log('first');
  resolve('yes');
}).then(
  new Promise(function(resolve, reject) {
    console.log('second');
    reject('no');
  })
).catch(rej => console.log(rej));

输出是:

'第一'

'秒'

我希望得到一个“否”输出,但没有。 不知道为什么 catch 没有捕捉到第二个 .then() 的拒绝?

【问题讨论】:

    标签: javascript ecmascript-6 es6-promise


    【解决方案1】:

    .then 只接受一个函数作为参数——你的

    then(new Promise
    

    将第二个.then 传递给一个Promise(当Promise 链被创建时被初始化,而不是在之前的Promise 解析时)。但是.then 不知道当它传递一个Promise 时该做什么,它只处理函数 参数。

    相反,传递 .then 一个函数,并让该函数创建要返回的 Promise,它将被正确捕获:

    new Promise(function(resolve, reject) {
      console.log('first');
      resolve('yes');
    }).then(
      () => new Promise(function(resolve, reject) {
    //^^^^^^
        console.log('second');
        reject('no');
      })
    ).catch(rej => console.log('catch: ' + rej));

    【讨论】:

    • 只是想知道,返回的承诺的最终状态是什么。在浏览器控制台中尝试了上述操作,并给出了在 chrome 中已解决并在 firefox 中待处理的最终状态。
    • 一个Promise 链,其最后一项是catch,不会引发错误,将始终导致已解决 Promise。 (您可以通过打开浏览器控制台看到这一点 - 如果 Promise 链导致 Promise 被拒绝,您会看到类似 Uncaught (in promise) <err> 的内容。只能在浏览器控制台中看到,而不是在堆栈 sn-p 控制台中看到)
    • 为什么 2 个浏览器的状态不同?是不是很奇怪?
    • 这是由于控制台的怪异,似乎 Firefox 会立即打印值,而 Chrome 会在 .then.catch 之后打印值(或更新值)有时间跑
    • 哦酷!将承诺存储在变量中会返回状态为已完成!关于控制台的怪异你是对的。
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2021-12-05
    • 2015-10-06
    • 2017-02-05
    • 2015-10-29
    • 2017-06-18
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多