手写Promise.then方法

Promise 的链式调用

我们可以用 Promise.prototype.then()方法将进一步的操作与一个变为已敲定状态的 promise 关联起来。
Promise.then() 方法需要两个参数,第一个参数作为处理已成功状态的回调函数,而第二个参数则作为处理已失败状态的回调函数。每一个 .then() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用,就像这样:

const MyPromise=new Promise((resolve,reject)=>{
	setTimeout(()=>{
		resolve('value');
	},0)
});
MyPromise.then(resolveA,rejectA)
MyPromise.then(resolveB,rejectB)

当 .then() 中缺少能够返回 promise 对象的函数时,链式调用就直接继续进行下一环操作。

由上可知:
.then() 方法返回一个新的 promise 实例,为了在 promise 状态发生变化时(resolve / reject 被调用时)再执行 then 里的函数,我们使用一个 callbacks 数组先把传给then的函数暂存起来,等状态改变时再调用。

为了保证后一个 then 里的方法在前一个 then(可能是异步)结束之后再执行
我们可以将传给 then 的函数和新 promise 的 resolve 一起 push 到前一个 promise 的 callbacks 数组中。当前一个 promise 完成后,调用其 resolve 变更状态,在这个 resolve 里会依次调用 callbacks 里的回调,这样就执行了 then()的方法;当 then() 的方法执行完成后,返回一个结果,如果这个结果是个简单的值,就直接调用新 promise 的 resolve,让其状态变更,然后依次调用新 promise 的 callbacks 数组里的方法,循环往复。。如果返回的结果是个 promise,则需要等它完成之后再触发新 promise 的 resolve,所以可以在其结果的 then 里调用新 promise 的 resolve。

MyPromise.prototype.then=function(onfulFilled,onReject){
	//保存前一个promise的this
	const self=this;
	let myPromise=new MyPromise((resolve,reject)=>{
		//封装前一个promise成功时执行的函数
		let fulFilled=()=>{
			try{
			const result=onFulfilled(self.value);
			//判断前一个promise函数执行完后返回值是否为promise
			return result instanceof MyPromise?result.then(resolve,reject):resolve(result);
			}catch(e){
				reject(e);
			}
		}
		// 封装前一个promise失败时执行的函数
		let rejected=()=>{
			try{
				const result=OnReject(self.err);
				return result instanceof MyPromise?result.then(resolve,reject):reject(result);
			}catch(e){
				reject(e);
			}
		}
		switch(self.status){
			case "pending":
				self.onFulFilledCallbacks(fulfilled);
				self.onRejectedCallbacks(rejected);
				break;
			case "resolved":
				fulfilled();
				break;
			default "rejected":
				rejected();
				break;
		}
	});
	return myPromise;
}

参考文章1
参考文章2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值