关于Promise规范及简单应用

本文介绍了Promise的基本概念、状态转换以及规范细节,包括Promise的三种状态、then方法的实现原理和手写Promise类的思路。重点讨论了then方法的参数要求、执行特性以及返回值规则,并探讨了微任务在Promise中的作用。通过实例展示了如何使用和测试自己实现的Promise类。
摘要由CSDN通过智能技术生成

什么是promise?

promise是异步编程的一种解决方案

术语

1.promise 是一个有then方法的函数或者对象
2.thenable 是一个有then方法的函数或者对象
3.value 是promise成功时候的值 也就是resolve的参数,类型可以是undefined/thenable promise,number,boolean,string,object等
4.reason 是promise失败时候的值 也就是reject的参数,标识失败的原因
5.exception 是使用throw抛出的异常值

规范

Promise States

promise应该有三种状态
1.pending
初始状态(可以改变),在resolve和reject之前,都是处于这个状态
resolve -> fulfilled
reject -> rejected
2.fulfilled
最终态,不可改变
一个promise 被resolve之后变成这个状态
必须拥有一个value值
3.rejected
最终态,不可改变
一个promise 被reject之后变成这个状态
必须拥有一个reason值
所以其实promise有两条路线:
pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected

then

promise应该提供一个then方法,用来返回最终结果

promise.then(onFulfilled,onRejected)

1.参数要求:onFulfilled和onRejected都必须是函数类型,如果不是函数,应该被忽略
2.特性:在promise编程fulfilled/rejuected时(在这之前不能调用),应该调用onFulfilled/onRejected,参数是value/reason,只能被调用一次(可能需要设置一个变量来限制执行次数)
3.onFulfilled和onRejected执行的时候应该是微任务:queueMicrotask来实现微任务调用
4.then可以被调用多次:promise变成onFulfilled/onRejected后,所有的回调都应该按then的顺序执行(用数组来存放onFulfilled/onRejected list)
5.then的返回值:应该返回一个promise

promise2 = promise1.then(xx,xxx)

假如onFulfilled/onRejected的执行结果是x,调用resolvePromise方法
如果onFulfilled/onRejected执行的时候抛异常e,promise2应该直接被reject
如果onFulfilled/onRejected不是一个函数,那么promise2以promise1的value触发onFulfilled/onRejected
6.resolvePromise(用以解析promise)

resolvePromise(promise2,x,resolve,reject)

(1)如果promise2和x强相等那么reject TypeError
(2)如果x是一个promise:
(2.1)如果x是pending,promise一定继续pending,直到x变成了onFulfilled/onRejected
(2.2)如果x是onFulfilled/onRejected,resolve same value/reject same reason
(3)如果x是一个function/object

	try
	let then = x.then;
	catch(e)
	reject promise e;

手写promise类

思路:
1.咱平常使用promise时,new Promise((resolve,reject)=>{}),既然要new,肯定就有constructor

constructor(){
   
        //初始状态
        this.status = PENDING;
        this.value = null;
        this.reason = null;
    }

2.promise有各个阶段的状态,咱也整点

//状态
const PENDING = "pending"
const FULFILLED = "fullfilled"
const REJECTED = "rejected"

3.前两个都有了,开始实现resolve和reject

	resolve(value){
   
        //限制条件
        if(this.status === PENDING){
   
            this.value = value;
            this.status = FULFILLED;
        }
    }
    reject(reason){
   
        if(this.status === PENDING){
   
            this.reason = reason;
            this.status = REJECTED;
        }

这里有一个重要的点就是:在两个函数的最开始,需要进行判断,必须是pending时,才可以resolve/reject,原因:假如现在处于rejected的状态,这个时候又走了resolve方法,那么对于status的处理是有问题的
4.现在还缺少promise构造时候的入参
注意点:入参是一个函数,接收resolve/reject,而且在初始化的时候就要执行这个函数,遇到报错直接reject

	constructor(){
   
        //初始状态
        this.status = PENDING;
        this.value = null;
        this.reason = null;
		//绑定this
        try {
   
            fn(this.resolve.bind(this),this.reject.bind(this));
        } catch (e) {
      
            this.reject(e);
        }
    }

5.还有一个关键的then需要实现
检查参数,做默认值处理

	then(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值