首页 > 其他分享 >为什么promise.then 和 promise.catch 捕获错误的顺序不一样?

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

时间:2023-11-17 19:07:14浏览次数:28  
标签:错误 捕获 Promise error catch promise 方法

promise.thenpromise.catch捕获错误的顺序不同的原因是它们的执行时机以及错误处理机制的不同。

当一个Promise被拒绝(rejected)时,它会立即触发错误处理程序。如果存在一个或多个catch方法,它们将按照添加的顺序执行,并且只有第一个匹配的catch方法会被调用。这意味着,当一个错误发生时,会优先执行最近添加的catch方法。

然而,then方法会在Promise状态变为已完成(fulfilled)时执行。它可以接受两个参数:第一个参数是处理已完成的回调函数,第二个参数是处理拒绝的回调函数。如果在then方法中抛出了一个错误,它将被传递到下一个catch方法中。

具体来说,如果在then方法中抛出错误,它会被Promise链的下一个catch方法捕获。这意味着错误的传递是基于Promise链的结构,而不是顺序添加thencatch方法的顺序。

让我们通过一个示例来说明这个问题:

Promise.resolve()
  .then(() => {
    console.log("Step 1");
    throw new Error("Error in Step 1");
  })
  .catch((error) => {
    console.log("Caught an error:", error.message);
  })
  .then(() => {
    console.log("Step 2");
  })
  .catch((error) => {
    console.log("Caught another error:", error.message);
  });

在上面的代码中,当Promise状态变为已完成时,会立即执行第一个then方法。由于我们在该方法中抛出了一个错误,它会被接下来的第一个catch方法捕获。然后,第二个then方法将被执行,并且最后一个catch方法将不会被调用,因为错误已经被捕获并处理了。

总结起来,promise.thenpromise.catch捕获错误的顺序不同是因为它们的执行时机和错误处理机制的不同。了解Promise链的结构和错误传递规则对于正确处理和捕获错误是很重要的。

标签:错误,捕获,Promise,error,catch,promise,方法
From: https://blog.51cto.com/M82A1/8451288

相关文章

  • async 和 await 如何捕获异常
    前言之前代码写法中使用async和await,没有捕获异常,导致不满足code===200条件时,页面无法抛出错误,如下所示:async和awaitsubmitForm(){this.$refs["form"].validate(async(valid)=>{if(!valid)return;this.btnLoading=true;......
  • Promise.all(iterable) 参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员
    下面关于Promise的all方法说法错误的是()Apromise.all(iterable),参数是一个数组B只有这个数组中的所有promise实例都resolve之后才会触发其返回的promise实例的thenC只要其中有任何一个promise实例被reject,那么最终的promise实例将触发catchD触发then时可以只带上iterable......
  • egret promise
    在TypeScript中,Promise是用于处理异步操作的对象。它表示一个可能在未来某个时间点完成或失败的操作,并返回操作结果或错误。Promise可以有三种状态:pending(进行中):Promise的初始状态,表示操作正在进行中。fulfilled(已完成):表示操作成功完成。rejected(已拒绝):表示操作失败。......
  • 如何通过 wireshark 捕获 C# 上传的图片
    一:背景1.讲故事这些天计划好好研究下tcp/ip,以及socket套接字,毕竟工控中设计到各种交互协议,如果只是模模糊糊的了解,对分析此类dump还是非常不利的,而研究协议最好的入手点就是用抓包工具wireshark,废话不多说,这篇通过wireshark提取一个小图片作为入手。二:wireshark图片抓包1......
  • (exp)/1 用 `\1` 对分组(exp)进行捕获
    关于正则表达式,下列说法正确的是:A\w用来匹配数字B/a?/表示匹配0到多个aCi修饰符表示忽略大小写D1表示对第一个捕获组的引用正确答案:C\w匹配字母数字或下划线;?匹配0个或1个;\1表示对第一个捕获组的引用;1、\w表示字母、数字、下划线\W表示除了字母、数字下划线的字符......
  • promise时效架构升级方案的实施及落地
    一、项目背景为什么需要架构升级promise时效包含两个子系统:内核时效计算系统(系统核心是时效计算)和组件化时效系统(系统核心是复杂业务处理以及多种时效业务聚合,承接结算下单黄金流程流量),后者依赖前者,分别由两组技术团队支持;因为有些业务的渗透造成两个系统的边界越来越不清晰;有......
  • fltk-rs如何捕获特定按键
    Rust语言这里演示了使用handle函数捕获“E”和向下键。usefltk::{prelude::*,*,window::Window,app::event_key};fnmain(){letapp=app::App::default().with_scheme(app::Scheme::Gleam);letmutwind=Window::default().with_size(100,100);letmu......
  • javascript promise all实现图片顺序加载
    不使用promise时是异步加载,图片加载的顺序不固定<!doctypehtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,user-scalable=no,initial-scale=1......
  • 异常处理机制(二)之异常处理与捕获
    一、异常概述1Error(错误):是指程序无法处理的错误,表示运行应用程序时比较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题。2异常(Exception):是指在程序执行时由于程序处理逻辑上的错误而导致程序中断的一种指令流。通俗的说,......
  • Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmedia
    下列关于Vue的描述错误的是()A当给某个组件修改某个值时,该组件不会立即重新渲染BVue内部使用原生Promise.then、MutationObserver和setImmediate实现异步队列,不会采用setTimeout(fn,0)C$nextTick()返回一个Promise对象D$nextTick()可以配合async/await使用正确答案:B官......