手写Promise中all、race、any方法

all方法

// all: 传入的所有Promise最终都转化为fulfilled态时,则会执行resolve回调,并将返回值是的所有的Promise的resolve的回调的value的数组。
// 其中一个任何Promise为reject状态时,则返回的Promise的状态更改为rejected。
function all(arr) {
    //返回一个promise
    return new Promise((resolve, reject) => {
        let length = arr.length //传入的promise的个数
        let count = 0 //进入fullfilled的promise个数
        const result = [] //创建一个等长的数组,放置结果
        // 当传递是一个空数组,返回一个为fulfilled状态的promise
        if (arr.length === 0) {
            return new Promise.resolve(arr)
        }
        for (let i = 0; i < arr.length; i++) {
            arr[i].then(resolve => {
                result.push(resolve) //将每次结果保存在result数组中
                count++ //个数加1
                //是否所有的promise都进入fullfilled状态
                if (count === length) {
                    resolve(result) //返回结果
                }
            }).catch(e => {
                reject(e) //如果有错误则直接结束循环,并返回错误
            })
        }
    })
}

race方法

//race: 传入的所有Promise其中任何一个有状态转化为fulfilled或者rejected,则将执行对应的回调。
function race(arr) {
    return new Promise((res, rej) => {
        for (let i = 0; i < arr.length; i++) {
            arr[i].then(resolve => {
                res(resolve) //某一promise完成后直接返回其值
            }).catch(e => {
                rej(e) //如果有错误则直接结束循环,并返回错误
            })
        }
    })
}

any方法

// 只需要有一个成功的即可
function any(arr){
    return new Promise((resolve,reject) => {
        let result = []
        let len = arr.length
        let rejectCount = 0
        for(let i = 0;i<len;i++){
            arr[i].then(res => {
                resolve(res)
            }).catch(e => {
                result.push(e)
                if(rejectCount === len){
                    reject(result)
                }
            })
        }
    })
}
手写实现 `Promise.all` 方法,可以按照以下步骤进行操作: 1. 创建一个新的 Promise 对象,并返回它。 2. 在内部创建一个数组 `results`,用于存储每个传入的 Promise 对象的结果。 3. 使用 `Array.from` 方法将传入的参数(可以是数组或类数组对象)转换为一个真正的数组。 4. 遍历数组的每个 Promise 对象,使用 `Promise.resolve` 方法将其转换为一个 Promise 对象。 5. 对于每个 Promise 对象,使用 `.then` 方法来处理其结果。 - 如果 Promise 对象 resolved,将结果存储到 `results` 数组。 - 如果 Promise 对象 rejected,直接将整个 `Promise.all` 的 Promise 对象 rejected,并传递该错误给它。 6. 在所有 Promise 对象都处理完毕后,如果没有任何错误,则将 `results` 数组作为参数解析传递给 `Promise.all` 的 Promise 对象,并使其 resolved。 以下是一个示例代码,展示了如何手写实现 `Promise.all` 方法: ```javascript function myPromiseAll(promises) { return new Promise((resolve, reject) => { const results = []; const promisesCount = promises.length; let resolvedCount = 0; if (promisesCount === 0) { resolve(results); return; } function handleResolve(index, value) { results[index] = value; resolvedCount++; if (resolvedCount === promisesCount) { resolve(results); } } function handleReject(error) { reject(error); } for (let i = 0; i < promisesCount; i++) { Promise.resolve(promises[i]) .then((value) => handleResolve(i, value)) .catch(handleReject); } }); } // 示例 Promise 对象 const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = new Promise((resolve) => setTimeout(resolve, 1000, 3)); // 使用自定义的 Promise.all 方法 myPromiseAll([promise1, promise2, promise3]) .then((results) => { console.log(results); // 输出: [1, 2, 3] }) .catch((error) => { console.log(error); }); ``` 通过以上代码,你可以手动实现 JavaScript 的 `Promise.all` 方法。请注意,这只是一个简单的示例,并没有处理所有可能的情况,如传入的参数不是一个数组等。在实际使用,建议使用 JavaScript 原生的 `Promise.all` 方法来处理多个 Promise 对象的并行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值