【JS基础】Promise.all() 和 Promise.race()

Promise.all

Promise.all().then() 适用于处理多个异步任务,且所有的异步任务都得到结果时的情况

场景:同一个页面,数据分别是从不同的后端接口获取的

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div class="box">
    <button type="button" onclick="clickFn()">点开弹出框</button>
</div>

<script>
    const clickFn = () => {
        this.alertMask = true; // 打开弹出框
        this.loading = true; // 暂时没数据,所以就呈现 loading 加载中状态

        // 第一个异步任务
        function asyncOne() {
            let async1 = new Promise(async (resolve, reject) => {
                setTimeout(() => {
                    let apiData1 = "第一个接口返回数据啦"
                    resolve(apiData1)
                }, 800)
            })
            return async1;
        }

        console.log('异步任务一', asyncOne())

        // 第二个异步任务
        function asyncTwo() {
            let async2 = new Promise(async (resolve, reject) => {
                setTimeout(() => {
                    let apiData2 = "第二个接口返回数据啦"
                    resolve(apiData2)
                }, 700)
            })
            return async2
        }

        console.log('异步任务二', asyncTwo())

        let paramsArr = [asyncOne(), asyncTwo()]

        /**
         * Promise.all 方法接收的参数是一个数组,数组中的每一项是一个个的 Promise 对象
         * 在 .then 方法里面可以取到 .all 的结果,这个结果是一个数组,数组中的每一项对应的就是 .all 数组中的每一项的请求结果返回的值
         */
        Promise
            .all(paramsArr)
            .then((value) => {
                console.log("Promise.all 方法的结果", value)
                this.loading = true; //
            })
    }
</script>

</body>
</html>

 

 

如果 Promise.all() 中,只要有一个 Promise 出现了异常,就会先执行catch,导致其他正常返回的数据无法使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div class="box">
    <button type="button" onclick="clickFn()">点开弹出框</button>
</div>

<script>
    const clickFn = () => {
        this.alertMask = true; // 打开弹出框
        this.loading = true; // 暂时没数据,所以就呈现 loading 加载中状态

        // 第一个异步任务
        function asyncOne() {
            let async1 = new Promise(async (resolve, reject) => {
                setTimeout(() => {
                    let apiData1 = "第一个接口返回数据啦"
                    resolve(apiData1)
                }, 800)
            })
            return async1;
        }

        console.log('异步任务一', asyncOne())

        // 第二个异步任务
        function asyncTwo() {
            let async2 = new Promise(async (resolve, reject) => {
                setTimeout(() => {
                    let apiData2 = "第二个接口返回数据啦"
                    reject('exception')
                }, 700)
            })
            return async2
        }

        console.log('异步任务二', asyncTwo())

        let paramsArr = [asyncOne(), asyncTwo()]

        /**
         * Promise.all 方法接收的参数是一个数组,数组中的每一项是一个个的 Promise 对象
         * 在 .then 方法里面可以取到 .all 的结果,这个结果是一个数组,数组中的每一项对应的就是 .all 数组中的每一项的请求结果返回的值
         */
        Promise
            .all(paramsArr)
            .then((value) => {
                console.log("Promise.all 方法的结果", value)
                this.loading = true; //
            }).catch((err) => {
            console.log(err)
            })
    }
</script>

</body>
</html>

Promise.race

Promise.race() 赛跑机制,只认第一名

场景:点击按钮发请求,当后端的接口超过一定时间,假设超过3秒,没有返回结果,就提示用户请求超时

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div class="box">
    <button type="button" onclick="clickFn()">点开弹出框</button>
</div>

<script>
    const clickFn = () => {
        this.alertMask = true; // 打开弹出框
        this.loading = true; // 暂时没数据,所以就呈现 loading 加载中状态

        // 第一个异步任务
        function asyncOne() {
            let async1 = new Promise(async (resolve, reject) => {
                setTimeout(() => {
                    let apiData1 = "某个请求"
                    resolve(apiData1)
                }, 4000)
            })
            return async1;
        }

        console.log('异步任务一', asyncOne())

        // 第二个异步任务
        function asyncTwo() {
            let async2 = new Promise(async (resolve, reject) => {
                setTimeout(() => {
                    let apiData2 = "超时请求"
                    resolve(apiData2)
                }, 3000)
            })
            return async2
        }

        console.log('异步任务二', asyncTwo())

        // 哪一个接口跑得快,结果就用谁的值
        let paramsArr = [asyncOne(), asyncTwo()]

        /**
         * Promise.all 方法接收的参数是一个数组,数组中的每一项是一个个的 Promise 对象
         * 在 .then 方法里面可以取到 .all 的结果,这个结果是一个数组,数组中的每一项对应的就是 .all 数组中的每一项的请求结果返回的值
         */
        Promise
            .race(paramsArr)
            .then((value) => {
                console.log('Promise.race方法的结果:', value)
                if(value === '超时请求'){
                    alert('接口超时了!')
                } else{
                    console.log('正常操作')
                }
            })
    }
</script>

</body>
</html>

 

posted @ 2023-06-15 22:01  zjy4fun  阅读(256)  评论(0编辑  收藏  举报