当前位置: 首页 > 知识库问答 >
问题:

javascript - 为什么promise.then 和 promise.catch 捕获错误的顺序不一样?

秦渝
2023-11-17
    Promise.resolve(Promise.resolve(1)).then(res => {        console.log(res)    }).catch(err => console.log(err))    Promise.resolve('fffff').then(res => {        console.log(res)    }).catch(err => console.log(err))    Promise.resolve(Promise.reject(999)).then(res => {        console.log(res)    }).catch(err => console.log(err))    Promise.resolve(Promise.resolve(2444)).then(res => {        console.log(res)    }).catch(err => console.log(err))    // 1 fffff 2444 999    // ------------------------------------------------------------------    Promise.resolve(Promise.resolve(1)).then(res => {        console.log(res)    }).catch(err => console.log(err))    Promise.resolve('fffff').then(res => {        console.log(res)    }).catch(err => console.log(err))    Promise.resolve(Promise.reject(999)).then(res => {        console.log(res)    }, err => console.log(err))    Promise.resolve(Promise.resolve(2444)).then(res => {        console.log(res)    }).catch(err => console.log(err))    // 1 fffff 999 2444

共有2个答案

闻人宇定
2023-11-17

执行顺序应该是这样的,先执行 then 方法里面的错误,如果有捕获,错误不会继续向下传递。否则才进入 catch

夏宪
2023-11-17

首先,需要明确一点:Promise.then() 和 Promise.catch() 的执行顺序是根据它们在代码中的出现顺序来确定的。

在你的代码中:

Promise.resolve(Promise.resolve(1)).then(res => {    console.log(res)}).catch(err => console.log(err))Promise.resolve('fffff').then(res => {    console.log(res)}).catch(err => console.log(err))Promise.resolve(Promise.reject(999)).then(res => {    console.log(res)}).catch(err => console.log(err))Promise.resolve(Promise.resolve(2444)).then(res => {    console.log(res)}).catch(err => console.log(err))

的执行顺序是:

  1. 首先执行第一个 Promise(Promise.resolve(Promise.resolve(1))),它返回一个已解决的 Promise,值为 1。然后,.then() 函数被调用并输出 1。
  2. 然后执行第二个 Promise(Promise.resolve('fffff')),它返回一个已解决的 Promise,值为 'fffff'。然后,.then() 函数被调用并输出 'fffff'。
  3. 接着执行第三个 Promise(Promise.resolve(Promise.reject(999))),它返回一个被拒绝的 Promise。因为这是一个被拒绝的 Promise,所以会跳转到 .catch() 函数并输出 999。
  4. 最后执行第四个 Promise(Promise.resolve(Promise.resolve(2444))),它返回一个已解决的 Promise,值为 2444。然后,.then() 函数被调用并输出 2444。

总结来说,Promise 的执行顺序是按照它们在代码中的出现顺序来的。.then() 函数会立即执行,而 .catch() 函数只有在 Promise 被拒绝时才会执行。所以如果你看到的结果是 1 fffff 2444 999,这实际上就是按顺序执行的代码的结果。

 类似资料:
  • 我必须用一些代码来回答这个问题: 假设我编写了以下方法规范: 您正在为一个将使用此方法的数据库程序编写代码,并且希望专门处理每个程序。try/catch子句应该是什么样的 您可以对catch子句内容使用no-ops——空块{}<我们只对这里语句的语法和结构感兴趣。 我回答说: 出于这个原因,他没有接受这个答案: “你的catch子句顺序不对。你能解释一下为什么顺序很重要吗?” 他的回答正确吗?

  • 问题内容: 有没有办法捕获in 中发生的错误并可能将其标记为页面中的错误? 举个简单的例子,假设我试图在一个不存在的HTML控件上绑定一个事件,我的浏览器抛出一个错误: 现在,如果我希望相同的错误无法通过我的selenium测试,并且浏览器上显示的消息将显示为错误消息。 可以做这样的事情吗? 问题答案: 将此脚本放在页面上,然后在Selenium中检查JSError:

  • 我有以下代码: null 我做错了什么?当MySQL抛出有关查询的错误时,我如何捕获?

  • 问题内容: 在此Java代码中, 我期望的输出是 但是有时候我得到这个预期的输出,而在其他时候我得到以下输出: 有时甚至是这个输出: 以及我是否获得第一,第二或第三输出似乎在每次执行期间都是随机发生的。我发现此POST显然在谈论相同的问题,但我仍然不明白为什么有时会得到输出1、2或3。如果我正确理解了这段代码,那么输出1应该是我每次得到的(发生异常) )。如何确保始终如一地获得输出1,或者能够确定

  • 问题内容: 原始问题: 当我的JavaScript调用的功能在页面下方而不是在调用页面的下方定义时,JSHint会抱怨。但是,我的页面是用于游戏的,在下载全部内容之前,不会调用任何函数。那么为什么订单功能出现在我的代码中很重要? 我在里面吟。看来我需要花另一天的时间才能重新排序六千行代码。使用javascript的学习曲线一点也不陡峭,但是非常糟糕。 问题答案: tl; dr 如果在加载完成之前不

  • 问题内容: 事件冒泡和捕获之间有什么区别?什么时候应该使用冒泡与捕获? 问题答案: 事件冒泡和捕获是HTML DOM API中事件传播的两种方式,当事件发生在另一个元素内部的元素中,并且两个元素都已注册了该事件的句柄时。事件传播模式确定元素以什么顺序接收事件。 冒泡时,事件首先由最内层元素捕获和处理,然后传播到外层元素。 通过捕获,事件首先被最外面的元素捕获并传播到内部元素。 捕获也称为“滴答”,