Promise的all、race、allSettled、any的实现

304 阅读2分钟

Promise.all的实现

全部状态成功才返回成功的数组集合,有一个状态失败就返回失败

// promise.all()
function PromiseAll(list) {
    return new Promise((resolve, reject) => {
        let result = []
        let count = 0
        list.forEach((item, index) => {
            item.then((res) => {
                result[index] = res
                count++
                count === list.length && resolve(result)
            }).catch((err) => reject(err))
        })
    })
}

const promiseList = [
    new Promise((resolve) => setTimeout(() => resolve('成功1'), 2000)),
    new Promise((resolve, reject) => setTimeout(() => reject('失败1'), 1000)),
    new Promise((resolve) => setTimeout(() => resolve('成功3'), 2600)),
    new Promise((resolve) => setTimeout(() => resolve('成功4'), 2300)),
]

PromiseAll(promiseList).then((res) => console.log(res)).catch((err) => console.log(err))
Promise.all(promiseList).then((res) => console.log(res)).catch((err) => console.log(err))

promise.race的实现

返回第一个率先改变状态的Promise结果

function PromiseRace(list) {
    return new Promise((resolve, reject) => {
        list.forEach((item) => {
            item.then((res) => resolve(res)).catch((err) => reject(err))
        })
    })
}

const promiseList = [
    new Promise((resolve) => setTimeout(() => resolve('成功1'), 3000)),
    new Promise((resolve, reject) => setTimeout(() => reject('失败1'), 4000)),
    new Promise((resolve) => setTimeout(() => resolve('成功3'), 2600)),
    new Promise((resolve) => setTimeout(() => resolve('成功4'), 2300)),
]

PromiseRace(promiseList).then((res) => console.log(res)).catch((err) => console.log(err))
Promise.race(promiseList).then((res) => console.log(res)).catch((err) => console.log(err))

promise.allSettled的实现

  • 永远返回成功的状态,返回的是数组集合;
  • 其中状态是成功的数据格式为: { status: 'fulfilled', value }
  • 其中状态是失败的数据格式为: { status: 'rejected', reason }
function PromiseAllSettled(list) {
    return new Promise((resolve) => {
        let result = []
        let count = 0
        list.forEach((item, index) => {
            item.then((res) => {
                result[index] = { status: 'fulfilled', value: res }
            }).catch((err) => {
                result[index] = { status: 'rejected', reason: err }
            }).finally(() => {
                count++
                count === list.length && resolve(result)
            })
        })
    })
}

const promiseList = [
    new Promise((resolve) => setTimeout(() => resolve('成功1'), 2000)),
    new Promise((resolve, reject) => setTimeout(() => reject('失败1'), 1000)),
    new Promise((resolve) => setTimeout(() => resolve('成功3'), 2600)),
    new Promise((resolve) => setTimeout(() => resolve('成功4'), 2300)),
]

PromiseAllSettled(promiseList).then((res) => console.log(res))
Promise.allSettled(promiseList).then((res) => console.log(res))

promise.any的实现

全部状态失败才返回失败,其中有成功的状态就返回那个成功的

function promiseAny(list) {
    return new Promise((resolve, reject) => {
        let count = 0
        list.forEach((item, index) => {
            item.then((res) => resolve(res)).catch((err) => {
                count++
                count === list.length && reject('都失败了')
            })
        })
    })
}

const promiseList = [
    new Promise((resolve) => setTimeout(() => resolve('成功1'), 3000)),
    new Promise((resolve, reject) => setTimeout(() => reject('失败1'), 1000)),
    new Promise((resolve) => setTimeout(() => resolve('成功3'), 2600)),
    new Promise((resolve) => setTimeout(() => resolve('成功4'), 2300)),
]

promiseAny(promiseList).then((res) => console.log(res)).catch((err) => console.log(err))

Promise.any(promiseList).then((res) => console.log(res)).catch((err) => console.log(err))