实现

/**
 * Promise.all 实现
 * 
 * 接受一个promise数组,返回一个新的promise
 * 当数组中所有的promise都完成时,返回结果数组
 * 当数组中任意一个promise失败时,返回第一个失败的原因
 *
 * @param {Array} promises promise数组
 * @returns {Promise} 新的promise
 */
Promise.all = function (promises) {
    // 参数检查:确保promises是可迭代对象
    if (!promises || typeof promises[Symbol.iterator] !== 'function') {
        return Promise.reject(new TypeError('参数必须是可迭代对象'))
    }
    
    // 空数组直接返回空结果数组
    if (promises.length === 0) {
        return Promise.resolve([])
    }
    
    return new Promise((resolve, reject) => {
        const result = []
        let count = 0
        
        // 使用forEach正确遍历promises数组
        promises.forEach((promise, index) => {
            // 使用Promise.resolve包装,确保非Promise值也能正确处理
            Promise.resolve(promise).then((res) => {
                // 保存结果到对应索引位置
                result[index] = res
                count++
                
                // 当所有promise都完成时,解析最终结果
                if (count === promises.length) {
                    resolve(result)
                }
            }).catch(err => reject(err)) // 任何一个promise失败都会导致整个Promise.all失败
        })
    })
}