promise简单实现

1、最简单的实现

promise有三种状态,分别是Pedding、Fulfilled、Rejected。

Pedding promise对象实例创建时的初始状态

Fulfilled可以理解为成功的状态

Rejected可以理解为失败的状态

2、构造一个Promise实例需要给Promise构造函数传入一个函数。传入的函数需要有两个形参,两个形参都是function类型的参数。分别是resolve和reject

3、Promise上还有then方法,then方法就是用来指定Promise对象的状态改变时确定执行的操作,resolve时执行第一个函数(onFulfilled),reject时执行第二个函数(onRejected)

当状态变为resolve时便不在变为reject,反之

基于上面描述我们可以实现一个这样的promise

function Promise(executor) { //executor执行器
		let self = this
		self.status = 'pending' //初始状态
		self.value = undefined //表示当前成功的值
		self.reason = undefined //表示是失败的值
		function resolve(value) { //成功的方法
			if (self.status === 'pending') {
				self.status = 'resolved'
				self.value = value
			}
		}
		function reject(reason) {
			if (self.status === 'pending') {
				self.status = 'rejected'
				self.reason = reason
			}
		}
		executor(resolve, reject)
	}

	Promise.prototype.then = function (onFufiled, onRejected) {
		let self = this
		if (self.status === 'resolved') {
			if (onFufiled) {
				onFufiled(self.value)
				return self //为了能链式调用catch 所以then方法下执行传入的回调函数 返回this
			} else {
				return self
			}
		}
		if (self.status === 'rejected') {
			if (onRejected) {
				onRejected(self.reason)
				return self
			} else {
				return self
			}
		}
	}
	Promise.prototype.catch = function (onRejected) {
		let self = this
		if (self.status === 'rejected') {
			if (onRejected) {
				onRejected(self.reason)
			} else {
				return
			}
		} else {
			return
		}
	}

测试一下

let p1 = new Promise((resolve, reject) => {
		let random = Math.floor(Math.random() * 10);
		if (random > 4) {
			resolve('sucess')
		} else {
			reject('erro')
		}
	})
	p1.then(res => {
		console.log(res)
	}).catch(err => {
		console.log(err)
	})

成功打印sucess或erro

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值