Promise.all和promise.race的应用场景举例

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

javascript 复制代码
<template>
  <div class="box">
    <el-button type="primary" plain @click="clickFn">点开弹出框</el-button>
  </div>
</template>

<script>
export default {
  name: "App",
  methods: {
    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());  // 返回的是一个Promise对象

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

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

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

打印的结果

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

javascript 复制代码
<template>
  <div class="box">
    <el-button type="primary" plain @click="clickFn">点击测试</el-button>
  </div>
</template>

<script>
export default {
  name: "App",
  methods: {
    async clickFn() {

      // 第一个异步任务
      function asyncOne() {
        let async1 = new Promise(async (resolve, reject) => {
          setTimeout(() => {
            // 这里我们用定时器模拟后端发请求的返回的结果,毕竟都是异步的
            let apiData1 = "某个请求";
            resolve(apiData1);
          }, 4000);
        });
        return async1;
      }
      console.log("异步任务一", asyncOne());  // 返回的是pending状态的Promise对象

      // 第二个异步任务
      function asyncTwo() {
        let async2 = new Promise(async (resolve, reject) => {
          setTimeout(() => {
            let apiData2 = "超时提示";
            resolve(apiData2);
          }, 3000);
        });
        return async2;
      }
      console.log("异步任务二", asyncTwo()); // 返回的是pending状态的Promise对象

      // Promise.race接收的参数也是数组,和Promise.all类似。只不过race方法得到的结果只有一个
      // 就是谁跑的快,结果就使用谁的值
      let paramsArr = [asyncOne(), asyncTwo()]

      Promise
      .race(paramsArr)
      .then((value) => {
        console.log("Promise.race方法的结果", value);
        if (value == "超时提示") {
          this.$message({
            type:"warning",
            message:"接口请求超时了"
          })  
        }else{
          console.log('正常操作即可');
        }
      })
    },
  },
};
</script>

补充~使用async、await搭配promise做异步任务的顺序控制

javascript 复制代码
<template>
  <div>
    <el-button type="primary" @click="look">查看顺序</el-button>
  </div>
</template>

<script>
import axios from "axios";
export default {
  methods: {
    async look() {
      await this.first(); // 使用await排队,方法中要使用promise包一层
      await this.second();
      await this.third();
    },
    first() {
      let p = new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log("定时器异步~我是first");
          resolve("ok"); // 要有resolve或者reject告知完成哦,否则后续的await不会执行
        }, 1200);
      });
      return p;
    },
    second() {
      let p = new Promise((resolve, reject) => {
        axios({
          method: "get",
          responseType: "blob",
          url: "http://ashuai.work:10000/getDoc",
        }).then(({ data }) => {
          console.log("接口异步~我是second", data);
          resolve("ok");
        });
      });
      return p;
    },
    third() {
      console.log("普通的~我是third");
    },
  },
};
</script>

效果图

相关推荐
醇氧11 分钟前
Ping 127.0.0.1 具有 32 字节的数据:一般故障。【二】
运维·服务器·开发语言
码农水水16 分钟前
中国邮政Java面试:热点Key的探测和本地缓存方案
java·开发语言·windows·缓存·面试·职场和发展·kafka
Van_captain16 分钟前
rn_for_openharmony常用组件_Divider分割线
javascript·开源·harmonyos
CCPC不拿奖不改名16 分钟前
python基础:python语言中的控制结构+面试习题
开发语言·python·学习
MM_MS17 分钟前
Halcon基础知识点及其算子用法
开发语言·人工智能·python·算法·计算机视觉·视觉检测
a程序小傲27 分钟前
小红书Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·后端·python·面试·职场和发展
北辰alk27 分钟前
2025:当Vibe Coding成为我的创意画布——一名前端工程师的AI元年记
前端·trae
jump_jump41 分钟前
SaaS 时代已死,SaaS 时代已来
前端·后端·架构
朝九晚五ฺ1 小时前
从零到实战:鲲鹏平台 HPC 技术栈与并行计算
java·开发语言
CUIYD_19891 小时前
Freemarker 无法转译 & 字符
java·开发语言·spring