面试官:你会手写一个promise吗?

之前面试过几个开发,问到他们,你会手写一个promise吗?他们都说不知道,我以为他们是没理解题目,于是,我补充一下,说一下promise的构造函数吧。但他们还是一脸懵逼,今天仔细想一想,还是出一个教程回答模板

我们先来看一段代码

class my_promise {
    constructor(exector) {
        this.status = "pending" //定义状态,有三种分别为 pending,fulfilled,rejected
        let _self = this
        this.reason = [] //rejected回调的参数
        this.value = []//resolve回调的参数
        this.resolveCallBack = [] //执行resolve回调的数组
        this.rejectCallBack = []  //执行reject回调的数组
        function resolve(...arg) {
            _self.value = arg
            _self.status = "fulfilled"
            _self.resolveCallBack.forEach((fn) => {
                fn(..._self.value)
            })
        }
        function reject(...arg) {
            _self.reason = arg
            _self.status = "rejected"
            _self.rejectCallBack.forEach((fn) => {
                fn(..._self.reason)
            })
        }
        exector(resolve, reject)
    }
    then(onResolve, onReject) {
        typeof onResolve == 'function' ? '' : onResolve = function (data) {
            resolve(data)
        }
        typeof onReject == 'function' ? '' : onReject = function (err) {
            throw err
        }
        if (this.status == "pending") {
            return new my_promise((resolve, reject) => {
                this.rejectCallBack.push(() => {
                    let t = onReject(...this.reason)
                    if (t instanceof my_promise) {
                        t.then(resolve, reject)
                    } else {
                        resolve(t)
                    }
                })
                this.resolveCallBack.push(() => {
                    let t = onResolve(...this.value)
                    if (t instanceof my_promise) {
                        t.then(resolve, reject)
                    } else {
                        resolve(t)
                    }

                })
            })

        }
        if (this.status == "fulfilled") {
            return new my_promise((resolve, reject) => {
                try {
                    let t = onResolve(...this.value)
                    if (t instanceof my_promise) {
                        t.then(resolve, reject)
                    } else {
                        resolve(t)
                    }
                } catch (err) {
                    reject(err)
                }
            })
        }
        if (this.status == "reject") {
            return new my_promise((resolve, reject) => {
                try {
                    let t = onReject(...this.reason)
                    if (t instanceof my_promise) {
                        t.then(resolve, reject)
                    } else {
                        resolve(t)
                    }
                } catch (err) {
                    reject(err)
                }
            })

        }
    }
}
let d = new my_promise((resolve, reject) => {
    resolve(3, 4)
})
d.then((n1, n2) => {
    console.log(n1, n2)
    let c = new my_promise((resolve, reject) => {
        setTimeout(() => {
            reject("c")
        }, 1000)

    })
    return c
}).then((n1) => {
    console.log(n1) //c
}, (n1) => {
    console.log("n1") //c
})

回答模板(仅供参考): 我们通过es6的class来实现,定义constructor时,声明一个叫status的属性,他的值有三种,分别为pending,fulfilled,rejected。同时,我们需要声明两个函数,分别为resolve和reject,这两个函数都可以改变status属性。然后将这两个函数当作参数传递给开发输入的函数,并执行该函数,这样constructor就完成了第一步,然后我们来实现then方法,then方法需要根据status属性来进行分开处理,如果状态是fulfilled或rejected,直接执行开发输于的函数即可,如果是pending,就需要将开发传给then的函数存入一个数组里,是的,接下来,我们需要完成constructor的最终步,我们需要给resolve和reject的函数加一行代码,执行数组的方法,这样就完成了大部分了,但是,还不够,我们有可能遇到链式调用,所以,我们还需要把then方法的返回值写成promise对象,核心方法,就是自己再声明一个promise对象

你可能感兴趣的:(ES6,面试)