上一次咱们写完了Promise的基础功能,明白了promise为什么能在任务成功的时候,调成功的回调函数,为什么在任务失败的时候调失败的回调函数.今天就把最麻烦的promise链式调用给搞定吧.javascript
附上上篇文章的连接:最最最通俗易懂的promise手写系列(一)
java
再附上上次的代码吧,以避免翻来翻去麻烦.promise
function Promise(executor) {
let self = this;
self.value = undefined;
self.reason = undefined;
self.status = 'pending';
self.onFulFilledCallbacks = [];
self.onRejectedCallbacks = [];
function resolve(value) {
if (self.status === 'pending') {
self.value = value;
self.status = 'resolved'
self.onFulFilledCallbacks.forEach(onFulFilled => {
onFulFilled(self.value)
});
}
}
function reject(reason) {
if (self.status === 'pending') {
self.reason = reason;
self.status = 'rejected';
self.onRejectedCallbacks.forEach(onRejected => {
onRejected(self.reason)
});
}
}
try {
executor(resolve, reject);
} catch (error) {
reject(error)
}
}
Promise.prototype.then = function (onFulFilled, onRejected) {
if (this.status === 'pending') {
this.onFulFilledCallbacks.push(() => {
onFulFilled(this.value)
});
this.onRejectedCallbacks.push(() => {
onRejected(this.reason)
})
} else if (this.status === 'resolved') {
onFulFilled(this.value);
} else if (this.status === 'rejected') {
onRejected(this.reason);
}
}
复制代码
咱们要完成的目标:异步
let p = new Promise(function (resove, reject) {
setTimeout(() => {
console.log('任务执行完了');
resove()
},1500)
});
p.then(function (value) {
console.log('第一个成功回调')
},function () {})
.then(function () {
console.log('第二个成功回调')
}, function () {});
输出以下:
任务执行完了
第一个成功回调
第二个成功回调
复制代码
rerun this
来作的,但是这里却不行,缘由文章末尾再解释。 咱们采起返回一个新的promise对象来实现链式调用.//给这个函数加个返回值,返回值就是一个新new的promise对象
Promise.prototype.then = function (onFulFilled, onRejected) {
let p2 = new Promise((resolve, reject) => {});
if (this.status === 'pending') {
this.onFulFilledCallbacks.push(() => {
onFulFilled(this.value)
});
this.onRejectedCallbacks.push(() => {
onRejected(this.reason)
})
} else if (this.status === 'resolved') {
onFulFilled(this.value);
} else if (this.status === 'rejected') {
onRejected(this.reason);
}
return p2;
}
复制代码
1.有异步操做,如咱们的例子里,有setTimout,延时1.5s后打印。函数
任务执行完了
,由于setTimout是异步的)2.没有异步操做,如咱们的例子里,有setTimout,延时1.5s后打印。post
//给这个函数加个返回值,返回值就是一个新new的promise对象
Promise.prototype.then = function (onFulFilled, onRejected) {
let p2 = new Promise((resolve, reject) => { resove() });
if (this.status === 'pending') {
this.onFulFilledCallbacks.push(() => {
onFulFilled(this.value)
});
this.onRejectedCallbacks.push(() => {
onRejected(this.reason)
})
} else if (this.status === 'resolved') {
onFulFilled(this.value);
} else if (this.status === 'rejected') {
onRejected(this.reason);
}
return p2;
}
复制代码
任务执行完了
调用第一个的resolve,第一个成功回调
//给这个函数加个返回值,返回值就是一个新new的promise对象
Promise.prototype.then = function (onFulFilled, onRejected) {
//p2的resolve在里面,外面拿不到,只有这样很贱的给在外面记下来了
let p2Resolve ;
let p2Reject;
let p2 = new Promise((resolve, reject) => {
p2Resolve = resolve;
p2Reject = reject;
});
if (this.status === 'pending') {
this.onFulFilledCallbacks.push(() => {
onFulFilled(this.value)
p2Resolve()
});
this.onRejectedCallbacks.push(() => {
onRejected(this.reason)
p2Reject()
})
} else if (this.status === 'resolved') {
onFulFilled(this.value);
p2Resolve()
} else if (this.status === 'rejected') {
onRejected(this.reason);
p2Reject()
}
return p2;
}
复制代码
输出以下:
任务执行完了
第一个成功回调
第二个成功回调测试
咱们剩下onFulFilled返回值的功能没作,下次子再来.
感谢各位观众.ui