【问题标题】:Unhandled Rejection Error - why? // Promise Chain Design decision?未处理的拒绝错误 - 为什么? // 承诺链设计决策?
【发布时间】:2019-10-15 21:20:37
【问题描述】:

A) 请参阅下面的代码。
如果我使用// 1 行,我会调用onError 方法,那没关系。
但是如果我使用// 2 行(并注释掉// 1),那么onError 仍然会被调用,但也会出现未处理的拒绝错误。为什么?这迫使我像// 1 那样进行链接。如果我不进行链接但在原始承诺上调用catch,那么我会得到unhandled rejection error

B) 为什么调用 p.thenp.catch 不返回原始承诺 p?我觉得这很奇怪。在我看到的所有允许链接的库中,返回原始对象(即this 对象)。在 JavaScript 中,当我们执行 promise1.then(...) 时,会返回一个新的 promise2,而不是 promise1。我觉得这很奇怪。这背后的逻辑推理是什么?对我来说,这似乎是一种不必要的复杂性,甚至是一种不好的做法。另一个gotcha 在使用JavaScript 时需要记住。但是好吧...我相信聪明人决定采用这种方法所以...这个决定背后的原因是什么?有任何想法吗?

    function onSuccess () {
      console.log('Success occurred!')
    }

    function onError () {
      console.log('Error occurred!')
    }

    const promise = new Promise((resolve, reject) => {
      setTimeout(() => {
        reject()
      }, 2000)
    })

    var p1 = promise.then(onSuccess);

    var p2 = p1.catch(onError); // 1 //
    // var p2 = promise.catch(onError); // 2 //

    console.log("DONE!");

【问题讨论】:

  • 如果有人可以为这个问题建议一个更好的标题,我可以更改它。
  • 为什么投反对票?这些都是非常有效的问题,并且高于中级 JavaScript 知识。这两个问题都是。
  • 您可以链接.then()s,然后继续对结果进行其他操作。如果.then() 返回了原来的承诺,你就不能链接它们。
  • @ChrisG 哦...好吧...这很明显...我想这回答了我的第二个问题,谢谢。所以真的是这个原因……?第一个问题呢?
  • @ADyson 或者他没有找到他想要的答案,因此来到 SO 做我们都来这里做的事情 - 找到我们自己无法回答的问题的答案

标签: javascript promise


【解决方案1】:

要回答你的第一个问题,这很简单:

当您到达您提到的那些行时,您有 2 个 promise 对象:一个由 promise 变量保存,另一个由 p1 变量保存。当您将catch 直接链接到promise 时,它不适用于从then 链接返回的承诺——它存储在p1 中——所以你在 上得到unhandled promise rejection errorthen 子句返回的承诺

但是,当您将其链接到已链接到 promisep1 时,catch 子句涵盖了它们,因此这里没有错误。

本质上的区别在于,//1 行可以捕获来自原始承诺和.then 承诺的拒绝/错误,但//2 行仅捕获来自原始承诺的拒绝,而使来自.then 的拒绝未处理。

关于第二个问题我很抱歉,但对我来说太高了,我不想给出不完整/不准确的答案。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2020-02-08
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多