Promise系列六

62 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

题外话

最近复习JS,让我倍感焦虑,总感觉还有好多自己不会的东西,越学越觉得深奥,到底是谁传出去JS简单的,出来,我保证不动手~~~~

话又说回来,难也得学啊。

那就接着手撕呗,上一篇我们对其他状态进行了一些处理,到目前为止,我们解决了

then的基本搭建

then的异步处理和多次调用

then的链式调用

then的循环调用

执行器运行出错和then运行出错

这一篇也是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的其他方法,下一篇见吧