带你手写promise (下)

329 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 上篇讲解了promise then catch等方法 这期一起来了解一下剩下的方法

Promise resolve 方法

    /*
        Promise函数对象的resolve方法
        返回一个指定value的成功promise
    */

    Promise.resolve = function (value) {
        // 返回一个成功/失败的promise
        return new Promise((resolve, reject) => {
            // value是promise 使用value得结果作为promise结果
            if (value instanceof Promise) {
                value.then(resolve, reject)
            } else {
                // value不是promise => promise变成功 数据是value
                resolve(value)
            }
        })
    }

Promise reject 方法

    /*
    
        Promise函数对象的reject方法
        返回一个指定reason的失败promise
    */

    Promise.reject = function (reason) {
        // 返回一个失败的promise
        return new Promise((resolve, reject) => {
            reject(reason)
        })
    }

Promise all方法

    /*
        Promise函数对象的all方法
        返回一个promise,只有当所有promise都成功时,否则失败
    */

    Promise.all = function (promises) {
        //用来保存所有成功value的数组 指定数组长度
        const values = new Array(promises.length)
        // 用来判断函数执行次数
        let resolvedCount = 0
        return new Promise((resolve, reject) => {
            // 遍历获取每个promise的结果
            promises.forEach((p, index) => {
                p.then(
                    value => {
                        resolvedCount++
                        // 将成功的value加入values
                        values[index] = value
                        // 如果全部成功了,将return的promise改变成功
                        if (resolvedCount === promises.length) {
                            resolve(values)
                        }
                    },
                    reason => {
                        // 只要一个失败整个就失败
                        reject(reason)
                    }
                )
            })
        })
    }

Promise race方法

    /*
        Promise函数对象的race方法
        返回一个promise,结果由第一个完成的promise决定
    */

    Promise.race = function (promises) {
        return new Promise((resolve,reject)=>{
            promises.forEach((p, index) => {
                p.then(
                    value => {
                        // 一旦有成功的,将return变为成功
                        resolve(value)
                    },
                    reason => {
                        // 一旦有失败的,将return变为失败
                        reject(reason)
                    }
                )
            })
        })
    }

class版本

class版本地址

总结

  • Promise全系文章更新结束
  • 下篇一起来看看JavaScript中的异步