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进行了一个简单的梳理,更多详情点击查看。