JS的同步异步处理——Promise

一、什么是Promise

        一个 Promise 是一个代理,它代表一个在创建 promise 时不一定已知的值。它允许你将处理程序与异步操作的最终成功值或失败原因关联起来。

二、Promise的三种状态

  • 待定(pending):初始状态,既没有被兑现,也没有被拒绝。
  • 已兑现(fulfilled):意味着操作成功完成。
  • 已拒绝(rejected):意味着操作失败。

我们在使用Promise时,可以用resolve, reject两个函数来控制其状态,前者时通过,后者是拒绝

三、用Promise处理并发的常用方法

1.Promise.all()

所有传入的 Promise 都被兑现时兑现;在任意一个 Promise 被拒绝时拒绝。

案例展示:

(1)全部都通过
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseC')
        }, 1500)
    })
    Promise.all([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

(2)有一个拒绝
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseC')
        }, 1500)
    })
    Promise.all([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:
(3)全部被拒绝 
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseC')
        }, 1500)
    })
    Promise.all([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

2.Promise.allSettled()

所有的 Promise 都被敲定时兑现。

案例展示:

(1)全部通过
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseC')
        }, 1500)
    })
    Promise.allSettled([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

(2)部分被拒绝
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseC')
        }, 1500)
    })
    Promise.allSettled([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
 结果:

(3)全部被拒绝
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseC')
        }, 1500)
    })
    Promise.allSettled([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

3.Promise.any()

任意一个 Promise 被兑现时兑现;仅在所有的 Promise 都被拒绝时才会拒绝。

案例展示:

(1)全部通过
    const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 5000)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseC')
        }, 1500)
    })
    Promise.any([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

注意函数触发时间

(2)部分不通过
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 5000)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseC')
        }, 1500)
    })
    Promise.any([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

(3)全部不通过
const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseC')
        }, 1500)
    })
    Promise.any([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

4.Promise.race()

任意一个 Promise 被敲定时敲定(即第一个)。

案例展示:

const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseA')
        }, 5000)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseC')
        }, 1500)
    })
    Promise.race([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

const promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('promiseA')
        }, 500)
    })
    const promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseB')
        }, 1000)
    })
    const promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('promiseC')
        }, 1500)
    })
    Promise.race([promiseA, promiseB, promiseC])
        .then(res => {
            console.log(res)
        })
        .catch(err => {
            console.log(err)
        })
结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星极天下第一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值