await 错误捕获实现方式源码示例解析

admin4周前笔记34

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

Promise 的使用方法
  • 创建一个 Promise 实例。这通常是通过调用 Promise 构造函数来完成的,并将一个函数作为参数传递给构造函数,该函数接收两个参数:resolve 和 reject。resolve 和 reject 分别用于处理 Promise 的成功和失败结果。

  • 在函数体内执行异步操作。当异步操作完成时,如果执行成功,则调用 resolve 函数来将 Promise 的状态变为“已完成”,并将结果作为参数传递给 resolve 函数;如果执行失败,则调用 reject 函数将 Promise 的状态变为“已拒绝”,并将失败的原因作为参数传递给 reject 函数。

  • 使用 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(
      promise: Promise,
      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启发得来的灵感。更加说明了融会贯通,学以致用的重要性。


相关文章

HTTP 报文详解

报文的语法所有的 HTTP 报文都可以分为两类:请求报文和响应报文。请求报文会向 Web 服务器请求一个动作,响应报文会将请求的结果返回给客户端。请求和响应报文的基本报文结构相同请求报文的格式:<...

nginx反向代理以及过滤静态文件的常用配置

nginx反向代理以及过滤静态文件的常用配置

nginx有两个重要的功能,一个是静态资源服务器,另一个就是反向代理,本文主要对nginx作为反向代理功能的主要配置做一个讲解。下面先看一个nginx的完整配置.nginx配置一个nginx的完整配置...

快速理解前后端分离的本质

快速理解前后端分离的本质

一、前后端分离本质大家往往会陷入一个误区,试图用具体的技术来描述什么是前后端分离这个一个概念,这是答非所问的。比如一提到前后端分离就是Laravel + Vue,这并不是完全正确的理解!我们问的是:你...

巧用watch 和 tail 命令监视 Linux 上的活动

巧用watch 和 tail 命令监视 Linux 上的活动

watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。watch 和 tail 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。...

云服务器的安全设置常识

云服务器的安全设置常识

1、服务器外置防火墙服务器安全组,有的叫安全组;有的叫防火墙2、外置防火墙和内置防火墙外置防火墙(安全组/防火墙)内置防火墙(iptables/firewalld)3、防火墙作用:防火墙就像一个门,想...

运维稳定性问题的关键–可用性

运维稳定性问题的关键–可用性

复盘更多的是基于事后的总结与提升。那么我们如何发现、测量稳定性问题呢?那么我们就需要请出今天的主角了——可用性。什么是可用性?可用性作为评价业务稳定性的一个重要指标,它可以通过数据量化、建立基线的方式...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。