Promise整体结构
调用部分:
<script src="./promise.js"></script>
<script>
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1) //代表value
// reject(2) //代表reason
// console.log('reject改变状态之后')
})
})
p.then(
value => {
console.log('onResolved1()', value)
},
reason => {
console.log('onRejected1()', reason)
}
)
p.then(
value => {
console.log('onResolved2()', value)
},
reason => {
console.log('onRejected2()', reason)
}
)
</script>
Promise部分:
//自定义Promise模块
//匿名函数自调用
(function(parms) {
const PENDING = 'pending'
const RESOLVED = 'resolved'
const REJECTED = 'rejected'
function Promise(excutor) {
const self = this //将当前promise对象保存起来
self.status = PENDING //给promise指定status属性,初始值为PENDING
self.data = undefined //给promise对象指定一个用于存储结果数据的属性、
self.callbacks = [] //每个元素的结构:{onRESOLVED(){},onREJECTED(){} {}}
//excutor 执行器函数
function resolve(value) {
//如果当前状态不是PENDING,直接结束
if (self.status != PENDING) {
return
}
//将状态改为RESOLVED
self.status = RESOLVED;
//保存value数据
self.data = value
//如果有待执行callback函数,立即执行异步回调函数onRESOLVED
if (self.callbacks.length > 0) {
setTimeout(() => { //模拟放到队列里执行所有成功后的回调
self.callbacks.forEach(callbacksObj => {
callbacksObj.onResolved(value)
});
})
}
}
function reject(reason) {
//如果当前状态不是PENDING,直接结束
if (self.status != PENDING) {
return
}
//将状态改为REJECTED
self.status = REJECTED;
//保存value数据
self.data = reason
//如果有待执行callback函数,立即执行异步回调函数onREJECTED
if (self.callbacks.length > 0) {
setTimeout(() => { //模拟放到队列里执行所有成功后的回调
self.callbacks.forEach(callbacksObj => {
callbacksObj.onRejected(reason)
});
})
}
}
//立即执行执行器函数excutor
//如果执行器抛出异常,promise变为失败
try {
excutor(resolve, reject)
} catch (error) {
reject(error)
}
}
//Promise的then方法
//向外暴露Promise函数
//Promise函数对象then
//指定成功的函数
//返回一个新的Promise对象
Promise.prototype.then = function(onResolved, onRejected) {
const self = this
//指定回调函数的默认值(必须是函数)
onResolved = typeof onResolved === 'function' ? onResolved : value => value
onRejected = typeof onRejected === 'function' ? onRejected : reason => reason
return new Promise((resolve, reject) => {
function handle(callback) {
// 执行指定的回调函数
//根据执行的结果改变return的promise状态
// 返回promise的结果有onResolved,onRejected执行结果决定
// 1.抛出异常,返回promise的结果为失败,reason为异常
try {
const result = onResolved(self.data)
if (result instanceof Promise) {
// result.then(
// value=>resolve(value),
// reason=>reject(reason)
// )
result.then(resolve, reject)
} else {
resolve(result)
}
} catch (error) {
reject(error)
}
}
//当前promise状态是resolve
//当前promise状态是reject
//当前promise状态是pending
if (self.status === RESOLVED) {
setTimeout(() => {
handle(onResolved)
})
} else if (self.status === REJECTED) {
setTimeout(() => {
handle(onRejected)
})
} else { //当前promise的状态是pending
//将成功和失败的回调函数保存callbacks容器中缓存起来
self.callbacks.push({
onResolved() {
handle(onResolved)
},
onRejected() {
handle(onRejected)
}
})
}
})
}
//Promise函数对象catch
//指定失败的函数
//返回一个新的Promise对象
Promise.prototype.catch = function(onReject) {
return this.then(undefined, onRejected)
}
//Promise函数对象resolve
//返回一个指定结果成功的Promise
Promise.resolve = function(value) {
}
//Promise函数对象reject
//返回一个指定结果失败的Promise
Promise.reject = function(reason) {
}
//Promise的all方法
//返回一个Promise,只有当所有的Promise都成功才成功,否则只要有一个失败的就是失败
Promise.all = function(promises) {
const valuse = new Array(promises.length); //用来保存所有成功value的数组
const cont = 0; //用来保存成功的次数
return new Promise((resolve, reject) => {
//遍历获取每一个promise的结果
promises.forEach((p, index) => {
Promise.resolve(p).then(
value => {
cont++
valuse[index] = value
//如果全部成功,将return的promise返回成功
if (cont == promises.length) {
resolve(values)
}
},
reason => { //只要有一个失败直接返回失败
reject(reason)
}
)
})
})
}
//Promise的race方法
//返回一个Promise,其结果由第一个完成的Promise结果决定
Promise.race = function(promises) {
return new Promise((resolve, reject) => {
//遍历获取每一个promise的结果
promises.forEach((p, index) => {
Promise.resolve(p).then(
value => { //一旦有成功了将return的promise变为成功
resolve(value)
},
reason => { //只要有一个失败直接返回失败
reject(reason)
}
)
})
})
}
window.Promise = Promise
})(window)
类的Promise写法:
//自定义Promise模块
//匿名函数自调用
(function(parms) {
const PENDING = 'pending'
const RESOLVED = 'resolved'
const REJECTED = 'rejected'
class Promise {
constructor(excutor) {
const self = this //将当前promise对象保存起来
self.status = PENDING //给promise指定status属性,初始值为PENDING
self.data = undefined //给promise对象指定一个用于存储结果数据的属性、
self.callbacks = [] //每个元素的结构:{onRESOLVED(){},onREJECTED(){} {}}
//excutor 执行器函数
function resolve(value) {
//如果当前状态不是PENDING,直接结束
if (self.status != PENDING) {
return
}
//将状态改为RESOLVED
self.status = RESOLVED;
//保存value数据
self.data = value
//如果有待执行callback函数,立即执行异步回调函数onRESOLVED
if (self.callbacks.length > 0) {
setTimeout(() => { //模拟放到队列里执行所有成功后的回调
self.callbacks.forEach(callbacksObj => {
callbacksObj.onResolved(value)
});
})
}
}
function reject(reason) {
//如果当前状态不是PENDING,直接结束
if (self.status != PENDING) {
return
}
//将状态改为REJECTED
self.status = REJECTED;
//保存value数据
self.data = reason
//如果有待执行callback函数,立即执行异步回调函数onREJECTED
if (self.callbacks.length > 0) {
setTimeout(() => { //模拟放到队列里执行所有成功后的回调
self.callbacks.forEach(callbacksObj => {
callbacksObj.onRejected(reason)
});
})
}
}
//立即执行执行器函数excutor
//如果执行器抛出异常,promise变为失败
try {
excutor(resolve, reject)
} catch (error) {
reject(error)
}
}
//Promise的then方法
//向外暴露Promise函数
//Promise函数对象then
//指定成功的函数
//返回一个新的Promise对象
then(onResolved, onRejected) {
const self = this
//指定回调函数的默认值(必须是函数)
onResolved = typeof onResolved === 'function' ? onResolved : value => value
onRejected = typeof onRejected === 'function' ? onRejected : reason => reason
return new Promise((resolve, reject) => {
function handle(callback) {
// 执行指定的回调函数
//根据执行的结果改变return的promise状态
// 返回promise的结果有onResolved,onRejected执行结果决定
// 1.抛出异常,返回promise的结果为失败,reason为异常
try {
const result = onResolved(self.data)
if (result instanceof Promise) {
// result.then(
// value=>resolve(value),
// reason=>reject(reason)
// )
result.then(resolve, reject)
} else {
resolve(result)
}
} catch (error) {
reject(error)
}
}
//当前promise状态是resolve
//当前promise状态是reject
//当前promise状态是pending
if (self.status === RESOLVED) {
setTimeout(() => {
handle(onResolved)
})
} else if (self.status === REJECTED) {
setTimeout(() => {
handle(onRejected)
})
} else { //当前promise的状态是pending
//将成功和失败的回调函数保存callbacks容器中缓存起来
self.callbacks.push({
onResolved() {
handle(onResolved)
},
onRejected() {
handle(onRejected)
}
})
}
})
}
//Promise函数对象catch
//指定失败的函数
//返回一个新的Promise对象
catch (onReject) {
return this.then(undefined, onReject)
}
//Promise函数对象resolve
//返回一个指定结果成功的Promise
static resolve(value) {
//返回一个成功/失败的promise
return new Promise((resolve, reject) => {
if (value instanceof Promise) { //使用value的结果
value.then(resolve, reject)
} else { //value不是promise
resolve(value)
}
})
}
//Promise函数对象reject
//返回一个指定结果失败的Promise
static reject(reason) {
return new Promise((resolve, reject) => {
reject(reason)
self.status = REJECTED
})
}
//Promise的all方法
//返回一个Promise,只有当所有的Promise都成功才成功,否则只要有一个失败的就是失败
static all(promises) {
const valuse = new Array(promises.length); //用来保存所有成功value的数组
const cont = 0; //用来保存成功的次数
return new Promise((resolve, reject) => {
//遍历获取每一个promise的结果
promises.forEach((p, index) => {
Promise.resolve(p).then(
value => {
cont++
valuse[index] = value
//如果全部成功,将return的promise返回成功
if (cont == promises.length) {
resolve(values)
}
},
reason => { //只要有一个失败直接返回失败
reject(reason)
}
)
})
})
}
//Promise的race方法
//返回一个Promise,其结果由第一个完成的Promise结果决定
static race(promises) {
return new Promise((resolve, reject) => {
//遍历获取每一个promise的结果
promises.forEach((p, index) => {
Promise.resolve(p).then(
value => { //一旦有成功了将return的promise变为成功
resolve(value)
},
reason => { //只要有一个失败直接返回失败
reject(reason)
}
)
})
})
}
// 返回一个promise对象,它在指定的时间后才确定结果
static resolveDelay(value, time) {
setTimeout(() => {
return new Promise((resolve, reject) => {
reject(reason)
self.status = REJECTED
})
}, time)
}
// 返回一个promise对象,它在指定的时间后才失败
static rejectDelay(value, time) {
setTimeout(() => {
return new Promise((resolve, reject) => {
reject(reason)
})
}, time)
}
}
window.Promise = Promise
})(window)
主要部分:
1.首先为Promise对象准备三个属性。
(1)status(Promise对象的状态)、
(2)data(Promise对象的数据)、
(3)callbacks(缓存Promise对象的回调函数)
2.调用执行器函数(excutor),执行器函数调用之前,需要准备两个函数(内部定义好),由外部使用者调用。执行器调用之前要对执行器函数进行异常检测,如果执行器函数异常。则调用reject函数
(1)resolve()
(2)reject()
3.实现resolve()和reject(),先要判断当前的状态,只有resolve和reject才可以进行回调函数的调用。注意,成功和失败的回调函数是异步的,常规都是先指定了回调函数,但是也可以先改变状态,在指定回调函数的(详细可查看我的前几篇文章),所以此处加了缓存回调函数数组的判断。
(1)改变状态
(2)保存数据
(3)异步执行,待执行的回调函数