promise
还有一个很重要的特点,then
办法能够被链式调用,前面一个then
办法失去的值是上一个then
办法的返回值
实现这个性能,须要两个步骤,第一是实现then
办法的链式调用,第二是把上一个then
办法回调函数返回值传递给下一个then
办法。
then
办法属于promise
一个属性,而且then
办法执行后返回一个promise
对象,那么能够在then
办法中new
一个promise
对象,并且返回,这样就能够始终执行then
办法。而promise的构造函数接管一个执行器,并且要立刻执行,那么将原有的then办法中的代码放入到执行器中就能够实现这个要求。
而在执行器中的代码逻辑也须要批改,胜利和失败状态中都须要判断返回值类型,如果是一般值,就能够立刻执行,传递给下一个promise
对象,如果是promise
对象,须要查看他的状态,并传递给下一个promise
对象。
解决返回值类型专用办法
function resolvePromise(e, resolve, reject) {
if (e instanceof MyPromise) {
// promise对象
// e.then((value) => {
// resolve(value)
// }, (reason) => {
// reject(reason)
// })
// 简化代码
e.then(resolve, reject);
} else {
//一般值
resolve(e);
}
}
then
办法批改
then(successCallback, failedCallback) {
let promise2 = new Promise((resolve, reject) => {
// 状态判断
if (this.status === FULFILLED) {
// 定义胜利回调返回值,传给下一个then的胜利回调
let successRtn = successCallback(this.value);
// 判断successRtn 的值是一般值还是promise对象
// 如果是一般值,间接调用resolve
// 如果是promise对象,查看promsie对象返回的后果
// 再依据promise对象返回的后果,决定调用resolve 还是调用reject
// 执行resolve办法,相当于把返回值传递给下一个then的胜利回调函数
resolvePromise(successRtn, resolve, reject);
} else if (this.status === REJECTED) {
let failedRtn = failedCallback(this.reason);
resolvePromise(failedRtn, resolve, reject);
} else {
// 期待,须要将胜利回调和失败回调存储起来,期待须要执行的时候才执行
this.successCallback.push(successCallback);
this.failedCallback.push(failedCallback);
}
});
return promise2;
}
测试代码
let promise = new MyPromise((resolve, reject) => {
resolve('---success----');
// setTimeout(()=>{
// resolve('success')
// },3000)
// reject("---failed----");
})
function other() {
return new MyPromise((resolve, reject) => {
resolve("a promise object")
})
}
promise.then(value => {
console.log(value);
return other();
}, reason => {
console.log(reason)
}).then(value => {
console.log(value)
})
测试打印
---success----
a promise object
阐明逻辑批改胜利
发表回复