zxdfe / FE-Interview

Every step counts
34 stars 1 forks source link

第32题:手写实现promise.all()? #33

Open zxdfe opened 2 years ago

ttizzyf commented 1 year ago
Promise.all = function (promises) {
    // 返回的结果是一个promise
    return new Promise((resolve, reject) => {
        let num = 0
        let arr = []
        // 需要确认每一个promise的状态,这里选择遍历数组
        for (let i = 0; i < promises.length; i++) {
            // 这里有两种结果,失败与成功
            promises[i].then(r => {
                // 成功的promise会调用第一个函数
                num++
                // 这里不能直接用push添加到数组中,会改变
                // 返回的成功态的promise的排列顺序
                // arr.push(r)
                arr[i] = r
                // 当数组的长度等于与num相等时证明所有promise状态为成功
                if (num === promises.length) {
                    resolve(arr)
                }
            }, v => {
                // 一旦有一个promise失败则直接调用reject
                reject(v)
            })
        }
    })