面试 实现手写 promise (一)

1.promise是一个构造函数,需要使用new来实例化
2.promise 有两个回调函数 resolve(成功) reject(失败) 来返回的内容

点击查看代码
class promise {
	constructor(response){
		//成功
		let resolve=()=>{ }
		//失败
		let reject=()=>{ }
		response(resolve,reject)
	}
}

3.内部存在三种状态state :pending(初始)、fulfilled(完成)、rejected(失败)
一但 状态到fulfilled/rejected,是不可逆转的,存在不可改变的值/失败原因
4.返回值:完成时 会在resolve中返回value值,状态state会被修改成fulfilled完成
失败时 会在reject中返回失败原因,状态state会被修改成rejected完成
存在一种特需情况就是:返回函数的报错的情况 直接reject(err)

点击查看代码
class promise {
	constructor(response){
		let state='pending' //状态
		let value 		//成功返回值
		let errject 	//失败返回原因
		//成功
		let resolve=(value)=>{
			//阻止逆向修改状态值
			if(this.state=='pending'){
				this.state='fulfilled' //修改state
				this.value=value  //储存成功的值
			}
		}
		//失败
		let reject=(errject)=>{
			//阻止逆向修改状态值
			if(this.state=='pending'){
				this.state='rejected' //修改state
				this.errject=errject  //储存失败的原因
			}
		}
		try{
		  response(resolve,reject)
		} catch (err) {
		  reject(err);
		}
	}
}

5..then方法的实现: promise.then(onFulfilled, onRejected) 最终会在onFulfilled中返回成功的值,onRejected中返回失败的原因

点击查看代码
class promise {
	constructor(response){
		let state='pending' //状态
		let value 		//成功返回值
		let errject 	//失败返回原因
		//成功
		let resolve=(value)=>{
			//阻止逆向修改状态值
			if(this.state=='pending'){
				this.state='fulfilled' //修改state
				this.value=value  //储存成功的值
			}
		}
		//失败
		let reject=(errject)=>{
			//阻止逆向修改状态值
			if(this.state=='pending'){
				this.state='rejected' //修改state
				this.errject=errject  //储存失败的原因
			}
		}
		try{
			response(resolve,reject)
		} catch (err) {
			reject(err);
		}
	}

	then(onFulfilled, onRejected){
		if(this.state === 'fulfilled'){ //完成时 返回值
			onFulfilled(this.value)
		}
		if(this.state === 'rejected'){ //失败时 返回原因
			onRejected(this.errject)
		}
	}
}

存在问题:1.当 promise 内部使用到异步操作时(定时器、网络请求),then方法调用的时候,promise内部的state还是pending状态,导致then获取的没有值
思路:当then的时候 状态为pending时 将 回调函数 的外面一层封装一个函数的调用,在resolve/reject中调用。
可参考观察者模式

2.实现链式调用 new Promise().then().then()
实现链式调用,需要返回一个新的promise/普通值 都要返回到下一个then中


posted @ 2022-03-01 17:16  xiao旭  阅读(466)  评论(0编辑  收藏  举报