慢慢来,这次一定能搞懂Promise

1.Promise到底是个什么东西?

让我们使用万能console打印一下它的内容。
在这里插入图片描述
根据控制控制台的输出可见Promise 是一个构造函数,本身身上有 all、reject、resolve 这几个方法,原型(prototype)上有 then、catch 等方法。
根据这些前置信息,我们可以简单实现编写代码实现一下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
		}
	}

2.实现什么效果

Promise 将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。可以通过链式调用多个 Promise 达到我们的目的。

3.如何使用

//1.promise 没有调用 resolve 或 reject 更改状态时,状态为 pending
const promise = new Promise((resolve, reject) => {
});

//2.resolve 指已经解决,将 promise 状态设置为fulfilled
const promise = new Promise((resolve, reject) => {
resolve("成功");
})
promise.then((msg) => console.log(msg) )

//3.reject 指拒绝处理,将 promise 状态设置为rejected
const promise = new Promise((resolve, reject) => {
reject("失败");
})
promise.then(err => console.log(err) )

//4.promise 传向 then 的传递值,如果 then 没有可处理函数,会一直向后传递
let p1 = new Promise((resolve, reject) => {
	reject("rejected");
}).then().then(null,f => console.log(f) );

//5.每次的 then 都是一个全新的 promise,默认 then 返回的 promise 状态是 fulfilled
let promise = new Promise((resolve, reject) => {
  resolve("fulfilled");
}).then(resolve => {
  console.log(resolve);//fulfilled
})
.then(resolve => {
  console.log(resolve);//undifind
});

4.一些个人理解

Promise确实是可以链式传递参数,但是感觉不是很有必要。主要应用的场景应该还是对网络请求(异步调用)进行执行顺序的控制。比如先进行个人身份认证,再进行登录操作。我这里只是针对自己的需求对Promise进行了一个简单的梳理,更多详情点击查看

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值