type
status
date
slug
summary
tags
category
icon
password
端午三天小长假,大家节日快乐!笔者最近在复习Promise及其原理,在此记录一下。有误请指教,大佬勿喷!

前置知识

在学习源码之前,我们需要了解Promise的常见用法和基本知识。我们都是通过new来创建一个Promise实例,并传入一个执行器,该执行器会立即执行。执行器接收两个参数,内部成功就resolve,失败则reject。代码如下:
接下来,我们就可以通过then进行链式调用,catch捕获错误:
以上,就是Promise最常见的用法。当然,还有一些Promise的其他语法,如Promise.all | Promise.finally | Promise.resolve等,在这里就不一一介绍了,有需要的可以去MDN了解。 哦对!Promise有三种状态,分别为等待(pending)、成功(fulfilled)、失败(rejected)。pending可以转化为fulfilled或者rejected,一旦转化,就不可再更改。

开始分析

接下来,我们开始分析promise的原理并实现它! 首先,通过我们了解到的知识,Promise其实就是通过new关键字生成实例的一个类,并接收一个执行器。执行器的参数是用来更改状态的。resolve表示成功,reject表示失败。那我们来开始定义吧!
上述代码的大致逻辑是:当调用new Promise()时,constructor会立即执行传入的函数,resolve函数将状态改为成功,reject函数将状态改为失败,且一旦状态已改变,则不能再更改! 我们接着来分析then方法:我们知道,then方法内部做的事情是判断状态。如果成功,需要调用成功的回调函数,否则调用失败的回调函数。成功回调函数有一个参数,表示成功之后的值,失败回调函数也有一个参数,表示失败的原因。并且,then方法是可以多次链式调用的,后一个then方法的回调函数拿到的值是上一个`then`方法回调函数的返回值。 基于以上,我们来手撕一下then方法!
锵锵锵!then诞生了!只要我们梳理出它的作用,其实也不难。到此,promise基本的作用及方法就写好了! 接下来,我们接着实现几个常用的方法!首先是catch,它的作用很简单,是用于捕获异常的,实现代码如下:
我们经常会使用Promise.resolve()去创建promise对象,实现方法也很简单:
我们常用的还有Promise.all()。该方法是用来解决并发问题的,我们来梳理一下。Promise.all()允许我们通过异步代码的调用顺序,得到异步代码的执行结果;all方法返回值也是promise对象。那么,我们来实现它!
当然,还有Promise.finally()方法!finally方法中的回调函数都会执行,无论成功失败;在finally方法后面可以链式调用then拿到结果。我们来搞定它!
到这里,我们已经实现了Promise的基本原理啦!先恭喜一下自己🎉 文章的最后贴一下完整代码吧~
函数式编程范式Canvas 基础
Loading...