IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript Promise的错误处理(五) -> 正文阅读

[JavaScript知识库]JavaScript Promise的错误处理(五)

今天我们来学习在Promise中如何处理异常错误。

假设有一个getUserById函数用来获取用户,它返回一个promise。

function getUserById(id) {
  return new Promise((resolve, reject) => {
    resolve({
      id: id,
      username: 'admin'
    });
  });
}

throw new Error

在返回promise之前,如果id参数不合法throw一个异常

function getUserById(id) {
  if (typeof id !== 'number' || id <= 0) {
    throw new Error('参数ID不合法');
  }

  return new Promise((resolve, reject) => {
    resolve({
      id: id,
      username: 'admin'
    });
  });
}

接着,调用这个promise,设置then、catch回调

getUserById('a')
  .then(user => console.log(user.username))
  .catch(error => console.log(error));

// 输出:
// Uncaught Error: 参数ID不合法

可以看到,then、catch都不会走,如果要捕获这个错误,必须要用try/catch

try {
  getUserById('a')
    .then(user => console.log(user.username))
    .catch(error => console.log(`.catch被调用:${error}`));
} catch (error) {
  console.log(`try/catch被调用:${error}`);
}

// 输出:
// try/catch被调用:Error: 参数ID不合法

在try/catch内成功捕获错误。

在Promise内throw

在promise内抛出异常

let authorized = false;

function getUserById(id) {
  return new Promise((resolve, reject) => {
    if (!authorized) {
      throw new Error('未登录,获取用户信息失败');
    }

    resolve({
      id: id,
      username: 'admin'
    });
  });
}

调用

try {
  getUserById(10)
    .then(user => console.log(user.username))
    .catch(error => console.log(`.catch被调用:${error}`));
} catch (error) {
  console.log(`try/catch被调用:${error}`);
}

// 输出:
// .catch被调用:Error: 未登录,获取用户信息失败

如果在promise内去throw抛出异常,则可以在.catch的回调中捕获到,在try/catch中无法捕获

如果使用链式调用promise,.catch将捕获任何一个promise的异常错误

promise1
  .then(promise2)
  .then(promise3)
  .then(promise4)
  .catch(err => console.log(err));

在上面的例子里,如果promise1、promise2有异常都会被.catch捕获到。

使用reject()函数

使用reject()函数和上面throw抛出异常一样,

let authorized = false;

function getUserById(id) {
  return new Promise((resolve, reject) => {
    if (!authorized) {
      reject('未登录,获取用户信息失败');
    }

    resolve({
      id: id,
      username: 'admin'
    });
  });
}

try {
  getUserById(10)
    .then(user => console.log(user.username))
    .catch(error => console.log(`.catch被调用:${error}`));
} catch (error) {
    console.log(`try/catch被调用:${error}`);
}

// 输出:
// .catch被调用:未登录,获取用户信息失败

在上面例子里,我们没有在promise内throw异常,而是调用reject()函数。同样也是在.catch被捕获。

没有.catch()方法会怎样

下面的例子里没有为promise提供.catch回调来捕获错误

let authorized = false;

function getUserById(id) {
  return new Promise((resolve, reject) => {
    if (!authorized) {
      reject('未登录,获取用户信息失败');
    }
    resolve({
      id: id,
      username: 'admin'
    });
  });
}

try {
  getUserById(10)
    .then(user => console.log(user.username));
  // 下面的代码会执行
  console.log('next');

} catch (error) {
  console.log(`try/catch被调用:${error}`);
}

// 输出:
// next
// Uncaught (in promise) 未登录,获取用户信息失败

如果promise被resolve,则可以省略catch()回调。上面console.log('next')将会执行。

总结

在promise中,.catch()函数会捕获promise内的throw错误和reject抛出的错误。

如果promise发生异常,而没有.catch()函数,也会在控制台抛出异常,但后面的代码依旧会执行。

如果文章有帮助,微信搜索【小帅的编程笔记】,跟着我每天进步一点点

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:45:45  更:2021-10-07 13:46:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 23:56:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码