Promise的实现原理(二)

Promise的实现原理(二)

1.在Promise的实现原理(一)中我们已经实现到同步的promise

class Mypromise {
	// executor 执行者,也就是调用方传过来的函数,他是立即执行的
	constructor(executor){
			// 状态设置,因为promise 的状态是一旦改变就不允许返回的,我们已0为初始化状态
		this.stateus= 0;
		// executor又有两个回调函数,一个成功的函数resolve,一个失败的状态reject,首先定义这两个函数
		// 使用者传回成功的value值
		const resolve = (value)=>{
			// 因为promise 的状态是不可逆的,因此这里需要更改status 的状态值
			// 用户在.then 的时候,需要在把value值返回给用户,因此要把value暂存一下
			this.successValue = value;
			this.stateus=1;
		}
		// 使用者传回失败的value值
		const reject= (value)=>{
			// 同上
			this.errorValue = value;
			this.stateus=2;
		}
		executor(resolve,reject);

	}
	// success,error是用户传过来的回调函数
	then(success,error){
		// 因为promise 是一旦成就不允许失败的,或者一旦失败不允许成功,所以这里要判断一下
		if(this.stateus===1){
			success(this.successValue)
		}
		if(this.stateus===2){
			error(this.errorValue)
		}
	}
}

1.2 当我们在Promise 中发一个ajax是,那我们现在这个代码就会出问题了,因为我们的代码的是同步的,ajax 是异步的。接下来我们解决如何解决Promise异步的事情。

1.2.1 简单使用

	new Promise((resolve,reject)=>{
			// 模拟异步
			setTimeout(()=>{
				resolve('成功')//3秒后返回成功字符串
			},3000)
	})

1.2.2 实现自己的异步

1.2.3 大概实现逻辑
①当用户调用.then时,因为是异步的,所有这个时候并没有调用resolve函数,所以此时的status的状态还处于0,
②当我们在.then中得到status的状态是0时,我们判断此时是一个异步的状态,解决此问题呢,我们可以把此时调用.then方法传过来的回调函数,存储在constructor中(this.successArray,this.errorArray),当我们异步完成任务调用resolve或者reject时,我们for循环当时存在constructor中的回调函数

class Mypromise {
	// executor 执行者,也就是调用方传过来的函数,他是立即执行的
	constructor(executor){
			// 状态设置,因为promise 的状态是一旦改变就不允许返回的,我们已0为初始化状态
		this.stateus= 0;
		// 新增代码
		// 异步的核心思想就是发布订阅,首先创建两个数组,分别来存储成功回调,以及失败的回调
		this.successArray = [];
		this.errorArray   = [];
		// 新增代码结束
		// executor又有两个回调函数,一个成功的函数resolve,一个失败的状态reject,首先定义这两个函数
		// 使用者传回成功的value值
		const resolve = (value)=>{
			// 因为promise 的状态是不可逆的,因此这里需要更改status 的状态值
			// 用户在.then 的时候,需要在把value值返回给用户,因此要把value暂存一下
			this.successValue = value;
			this.stateus=1;
			// 新增代码
			// 循环调用.then时的回调函数
			this.successArray.forEach(fn=>fn())
			// 新增代码结束
		}
		// 使用者传回失败的value值
		const reject= (value)=>{
			// 同上
			this.errorValue = value;
			this.stateus=2;
			// 新增代码
			// 循环调用.then时的回调函数
			this.successArray.forEach(fn=>fn())
			// 新增代码结束
		}
		executor(resolve,reject);

	}
	// success,error是用户传过来的回调函数
	then(success,error){
		// 因为promise 是一旦成就不允许失败的,或者一旦失败不允许成功,所以这里要判断一下
		if(this.stateus===1){
			success(this.successValue)
		}
		if(this.stateus===2){
			error(this.errorValue)
		}
	//新增代码
	// 当用户调用.then 时,我们的status 处于0的状态
	if(this.stateus===0){
		// 这里我们push 一个函数,是因为我们可以在这个函数中可以扩展一些东西
		this.successArray.push(()=>{
			success(this.successValue)
		});
		this.errorArray.push(()=>{
			error(this.errorValue)
		});
	}

	// 新增代码结束
		
	}
}

下一个文章(Promise的实现原理(三))讲解如何实现Promise 的链式调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值