如何在Promise链中处理Promise.reject()抛出的错误?

简介: 如何在Promise链中处理Promise.reject()抛出的错误?

在Promise链中,可以通过多种方式处理Promise.reject()抛出的错误,以下是一些常见的方法:

使用catch方法

在Promise链中,catch方法专门用于捕获链中任何一个Promise被拒绝时抛出的错误。当Promise.reject()被调用时,控制流会立即跳转到最近的catch方法。

Promise.reject(new Error('这是一个错误'))
 .then(() => {
   
    // 这里不会被执行
    console.log('成功');
  })
 .catch((error) => {
   
    console.log('捕获到错误:', error.message);
  });

使用finally方法

finally方法无论Promise是成功还是失败都会执行,通常用于执行一些清理操作,但也可以在finally中处理错误状态,不过它不能阻止错误继续向上传播。

Promise.reject(new Error('这是一个错误'))
 .finally(() => {
   
    // 可以在这里进行一些资源释放等操作
    // 也可以根据需要重新抛出错误或进行其他处理
    try {
   
      // 尝试执行一些可能会出错的清理操作
    } catch (error) {
   
      console.log('finally中捕获到错误:', error.message);
    }
  });

在多个then中处理

每个then方法都可以接受两个参数,第一个是成功回调,第二个是失败回调。可以在失败回调中处理Promise.reject()抛出的错误。

Promise.reject(new Error('这是一个错误'))
 .then(
    () => {
   
      // 成功回调,不会执行
      console.log('成功');
    },
    (error) => {
   
      console.log('捕获到错误:', error.message);
    }
  );

多层Promise链处理

在多层Promise链中,错误会一直向上传播,直到被catch捕获。

const promise1 = Promise.reject(new Error('第一层错误'));

const promise2 = promise1.then(() => {
   
  // 这里不会被执行
  return '成功';
});

const promise3 = promise2.catch((error) => {
   
  console.log('第二层捕获到错误:', error.message);
  // 可以选择在这里继续返回一个Promise,或者处理完错误后返回一个值
  return '错误已处理';
});

promise3.then((result) => {
   
  console.log('最终结果:', result);
});

使用async/await结合try/catch

async/await语法可以让异步代码看起来更像同步代码,使用try/catch可以方便地捕获Promise.reject()抛出的错误。

async function test() {
   
  try {
   
    await Promise.reject(new Error('这是一个错误'));
  } catch (error) {
   
    console.log('捕获到错误:', error.message);
  }
}

test();
相关文章
|
存储 开发工具 git
Vscode 拉取代码时出现 在签出前 请先清理仓库工作树
Vscode 拉取代码时出现 在签出前 请先清理仓库工作树
2237 0
|
前端开发
若依(ruoyi)前端Vue3 Element Plus Vite版样式修改
若依(ruoyi)前端Vue3 Element Plus Vite版样式修改
2592 0
|
存储 安全 测试技术
C# 中模拟HTTPS提交及模拟文件上传
【1月更文挑战第5天】昨天讲到用C#模拟POST还有GET进行数据提交,如果遇到的是https或者一些特殊信道的提交昨天的代码就会跑不通,今天就来说一下C#中https的提交以及模拟文件上传
|
存储 小程序
微信小程序使用本地存储方法wx.setStorageSync()和wx.getStorageSync()
微信小程序使用本地存储方法wx.setStorageSync()和wx.getStorageSync()
|
前端开发 JavaScript
如何让input框在用户输入后,文字居中显示
如何让input框在用户输入后,文字居中显示
714 0
|
9月前
|
前端开发 JavaScript
Promise.reject()和throw有什么区别?
Promise.reject()和throw有什么区别?
325 57
|
JSON 搜索推荐 C++
vscode如何更改背景颜色主题,黑色或白色?
【11月更文挑战第16天】在 VS Code 中更改背景颜色主题,可通过三种方式实现:1) 使用快捷键 Ctrl+K 和 Ctrl+T(Mac 上为 Command+K 和 Command+T)选择主题;2) 通过菜单中的“管理”->“颜色主题”选项选择;3) 修改 settings.json 文件中的 "workbench.colorTheme" 属性。此外,用户还可从扩展市场安装更多主题以满足个性化需求。
24535 6
|
Java 开发工具
开发工具系列 之 同一个电脑上安装多个版本的JDK
这篇文章介绍了如何在一台电脑上安装和配置多个版本的JDK,包括从官网下载所需JDK、安装过程、配置环境变量以及如何查看和切换当前使用的JDK版本,并提到了如果IDEA和JDK版本不兼容时的解决方法。
开发工具系列 之 同一个电脑上安装多个版本的JDK