【问题标题】:ES6 Promise then follows catch but catch never gets called [duplicate]ES6 Promise 然后跟随 catch 但 catch 永远不会被调用 [重复]
【发布时间】:2019-02-24 08:51:08
【问题描述】:

我对这个 Promise 代码有疑问。为什么记录“Foo”?我很困惑,因为“then”紧随“catch”,而“catch”从未被调用,为什么执行会流入“then”?

let myPromise = new Promise((resolve, reject) => {
  resolve("Foo");
});

myPromise.catch((value) => {
  console.log('inside catch');
}).then((value) => {
  console.log(value);
});

【问题讨论】:

  • catch() 只会在 promise reject() 时执行。
  • 试试throw("Baz"); 看看结果
  • catch() 方法返回一个 Promise 并且只处理被拒绝的情况。
  • 也许我弄错了,但我觉得你的困惑来自这样一个事实,你可能认为then 只有在catch 的回调被调用时才会被调用。它没有。 thencatch 都是同步调用的。这些方法中的每一个都返回一个新的 Promise。它们的回调被异步调用,它们的执行将取决于 Promise 链中发生的事情。
  • @Kaiido 谢谢!您的解释很有帮助!

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

请阅读 Promise 的文档。

catch 只有在 promise 被拒绝时才会被调用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

作为旁注,与问题无关:

在大多数书面代码中,then 通常出现在 catch 之前,尽管并非必须如此。

【讨论】:

  • 对不起,我有点懒,但你能指出这些文档中的哪个地方说“then 应该总是出现在catch之前” ?对 always 进行简单的单词搜索只返回关于 Promise#length 的段落,我可以看到在此之前你想要捕获的各种情况。
  • 我不是这个问题的作者。不,它不应该成为标准,因为两者都有应用程序。语义在这里无关,它只是简单的逻辑。如果逻辑是您期望 Promise 将拒绝并希望以不会破坏链其余部分的方式处理它,那么在下一个 then() 之前添加一个 catch(handlePossibleError) 是完全正确的
  • 是的,你是对的,我重写了我的答案,以便更多地关注所提出的真正问题。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2018-08-08
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2016-06-30
  • 2017-05-24
相关资源
最近更新 更多