持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
题外话
最近复习JS,让我倍感焦虑,总感觉还有好多自己不会的东西,越学越觉得深奥,到底是谁传出去JS简单的,出来,我保证不动手~~~~
话又说回来,难也得学啊。
那就接着手撕呗,上一篇我们对其他状态进行了一些处理,到目前为止,我们解决了
这一篇也是then方法的收尾篇,我们需要解决最后一个问题,就是then方法参数可选的问题。那就开始吧
正文
我们先看官方Promise的案例
let promise = new MyPromise((resolve, reject) => {
resolve(1)
})
promise.then().then().then(resp => { console.log(resp); })
//等同于
let promise = new MyPromise((resolve, reject) => {
resolve(1)
})
promise.then(resp => resp).then(resp => resp).then(resp => { console.log(resp)})
我们发现当链式结构的第一个和第二个then方法里面都没有回调函数接收返回值,但是最终then方法依旧可以接受到promise对象的返回值,我们现在就需要完成这个最后的问题。
我们可以这样处理,我们判断前一个then方法是否有返回值,如果有返回值我们就正常返回,如果没有返回值我们就手动给它补上一个返回值。
这里也分为两种情况:一种是成功回调,一种是失败回调。成功回调我们如果判断为没有我们就手动补上一个回调函数,如果是失败回调没有我们就throw抛出一个错误。
这里就仅展示then部分的代码,全部代码可以查看之前的系列文章
then(successCallback, failCallback) {
//判断回调函数是否存在,如果是成功回调没有就手动补上,如果是没有失败回调那就需要抛出这个错误
successCallback = successCallback ? successCallback : resp => resp
failCallback = failCallback ? failCallback :error => {throw error}
let promise = new MyPromise((resolve, reject) => {
if (this.status === FULFILLED) {
setTimeout(() => {
try {
let result = successCallback(this.resp)
returnPromise(promise, result, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
} else if (this.status === REJECTED) {
setTimeout(() => {
try {
let result = failCallback(this.error)
returnPromise(promise, result, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
} else {
// this.successCallback.push(successCallback)
// this.failCallback.push(failCallback)
this.successCallback.push(() => {
setTimeout(() => {
try {
let result = successCallback(this.resp)
returnPromise(promise, result, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
})
this.failCallback.push(() => {
setTimeout(() => {
try {
let result = failCallback(this.error)
returnPromise(promise, result, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
})
}
})
return promise
}
}
结束
关于手撕Promise.property.then的知识点我们就写到这些,接下来的几篇我们将开始介绍关于promise的其他方法,下一篇见吧