首页 > 编程语言 >源码共读 | 如何优雅的捕获 await 的错误

源码共读 | 如何优雅的捕获 await 的错误

时间:2023-04-13 22:37:53浏览次数:46  
标签:异步 函数 err 共读 await 源码 Promise catch

前言

Promise 是一种在 JavaScript 中用于处理异步操作的机制。Promise 在开发中被广泛使用,这篇文章将学习如何优雅的捕获 await 的错误。

资源:

Promise 的使用方法

  1. 创建一个 Promise 实例。这通常是通过调用 Promise 构造函数来完成的,并将一个函数作为参数传递给构造函数,该函数接收两个参数:resolve 和 reject。resolve 和 reject 分别用于处理 Promise 的成功和失败结果。
  2. 在函数体内执行异步操作。当异步操作完成时,如果执行成功,则调用 resolve 函数来将 Promise 的状态变为“已完成”,并将结果作为参数传递给 resolve 函数;如果执行失败,则调用 reject 函数将 Promise 的状态变为“已拒绝”,并将失败的原因作为参数传递给 reject 函数。
  3. 使用 then 方法来处理 Promise 的成功和失败结果。then 方法接收两个参数:一个处理成功结果的函数和一个处理失败结果的函数。在 Promise 状态变为“已完成”或“已拒绝”后,then 方法会自动执行相应的处理函数。

示例代码如下:

const myPromise = new Promise(function(resolve, reject) {
  // 执行异步操作
  setTimeout(function() {
    // 异步操作成功
    resolve('Success');
  }, 1000);
});

// 处理 Promise 的成功和失败结果
myPromise.then(function(result) {
  // 处理成功结果
  console.log(result);
}).catch(function(err){
  // 处理失败
  console.log(err)
})

异步函数正在等待 Promise,因此当 promise 遇到错误时,它会抛出一个异常,该异常将在 promise 的 catch 方法中捕获。

其他处理错误的方式:

try{
    const res = await myPromise()
}catch(e){
    console.log(e)
}

当代码中有大量的异步操作时,就需要有很多的try/catch 块,代码看起来就很臃肿,那么有什么更好的处理这些错误的办法呢?

await-to-js

这个项目的 slogan 是:

Async await wrapper for easy error handling

异步等待包装,方便错误处理

用法:

import to from 'await-to-js';

[ err, user ] = await to(UserModel.findById(1));
if(!user) return cb('No user found');

to 函数接收一个 Promise,然后将成功响应解析为数组,并将返回数据作为第二项。从捕获中收到的错误作为第二项。

源码

/**
 * @param { Promise } promise
 * @param { Object= } errorExt - Additional Information you can pass to the err object
 * @return { Promise }
 */
export function to<T, U = Error> (
  promise: Promise<T>,
  errorExt?: object
): Promise<[U, undefined] | [null, T]> {
  return promise
    .then<[null, T]>((data: T) => [null, data])
    .catch<[U, undefined]>((err: U) => {
      if (errorExt) {
        const parsedError = Object.assign({}, err, errorExt);
        return [parsedError, undefined];
      }

      return [err, undefined];
    });
}

export default to;

接收一个 Promise 实例和一个可选的 errorExt 对象作为参数。该函数返回一个新的 Promise。

原理是使用 then 方法处理 Promise 的成功结果,并使用 catch 方法处理 Promise 的失败结果。如果 Promise 执行成功,则会将结果包装成一个包含两个元素的数组并作为新的 Promise 的成功结果返回;如果 Promise 执行失败,则会将错误对象包装成一个包含两个元素的数组并作为新的 Promise 的失败结果返回。

总结

使用await-to-js,得以一行代码完成对异步代码错误的捕获,阅读文章得知,await-to-js 是作者通过goLang启发得来的灵感。更加说明了融会贯通,学以致用的重要性。

标签:异步,函数,err,共读,await,源码,Promise,catch
From: https://blog.51cto.com/codeniu/6188447

相关文章

  • IDEA之如何Debug源码跟踪
    IDEA之如何Debug源码跟踪以Debug模式启动服务,左边的一个按钮则是以Run模式启动。在开发中,我一般会直接启动Debug模式,方便随时调试代码。断点:在左边行号栏单击左键,或者快捷键Ctrl+F8打上/取消断点,断点行的颜色可自己去设置。Debug窗口:访问请求到达第一个断点后,会自动激活Debug......
  • 【开源项目】虎门大桥数字孪生应用智慧桥梁——开放数据及源码
    体验虎门大桥数字孪生技术,免费获取工程和源码,助力您的工程数字化转型。项目介绍虎门大桥是中国广东省珠海市和东莞市之间的一座跨海大桥,是世界上最长的跨海大桥之一,也是中国的一项重要基础设施工程。通过数字孪生技术,成功地实现了对桥梁的仿真和优化,给虎门大桥带上智慧的"眼睛"。通......
  • 【Java】wait、await、sleep的区别和联系
     (200条消息)Java之wait、await、sleep的区别和联系_javawait和await区别_wotu__的博客-CSDN博客 一、wait()notify()notifyAll()调用wait()使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程运行时使得这个条件满足时,其他线程会调用notify()或者notifyAll()来唤......
  • TreeMap源码
          常见面试题:    ......
  • 互联网医院源码|互联网医院软件|互联网医院平台搭建
    在现有信息化建设的基础上,构建基于互联网和新一代信息技术的,以客户体验为核心的服务、管理、协作体系,开创没有围墙的开放式医疗服务新格局。互联玩医院搭建基于互联网和新一代信息技术的,以客户体验为核心的服务、管理、协作体系,开创没有围墙的开放式医疗服务新格局。互联网医院源......
  • 手机直播源码,JS实现页面下拉加载数据操作
    手机直播源码,JS实现页面下拉加载数据操作主要是在id="ph"的div内加载数据: <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml&qu......
  • 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果
    最近更新一个Blazorserver的项目,顺带把用到的Ant-Design-Blazor升级到了最新的0.14.4,结果发现之前在0.8.4版本中Tree组件的搜索显示效果变了,从仅显示找到的节点变成了在全部节点中高亮显示匹配的结果,为了节省用户沟通成本(就是懒得跟最终用户费口舌解释),于是自己动手把这个......
  • Linux系统之源码编译部署Redis数据库
    (Linux系统之源码编译部署Redis数据库)一、Redis数据库介绍1.Redis简介Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库。2.Redis特点Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-va......
  • spring源码-之解决循环依赖
    Spring如何解决循环依赖为了解决循环依赖,Spring使用了三级缓存。一级缓存用于存储bean定义。二级缓存用于存放已经创建但还没有完全初始化的前期bean实例。三级缓存用于存放完全初始化的bean实例。当检测到循环依赖时,Spring会创建一个部分初始化的bean实例并将其存储在二......
  • 欢乐商城源码/品云购商城源码/英文版商城源码/全开源 可二开
    demo软件园每日更新资源,请看到最后就能获取你想要的:1.欢乐商城源码/品云购商城源码/英文版商城源码/全开源可二开商城源码/英文版商城源码/全开源可二开出海项目源码后台为中文语言页面效果:2.SQL学习指南(第2版)这是一本关于SQL的书,不是关于数据库的。以MySQL为例来......