vue循环中调用接口-promise.all();按顺序执行异步处理方式

 更新时间:2023年07月19日 16:08:35   作者:储储随记  
这篇文章主要介绍了vue循环中调用接口-promise.all();按顺序执行异步处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue循环调用接口-promise.all();按顺序执行异步处理

在vue中循环调用接口-promise.all()

methods: {
  handleAdd (arr) {
     this.loading = true
     const allApi = []
     arr.forEach((item, index) => {
       const data = {
         id: item.id,
         name: item.name
       }
       const oneApi = api.add(data).then(res => {
         if (res.error_code === 0) {
           this.$message.success(res.msg)
         } else {
           this.$message.error(res.msg)
         }
       })
       allApi.push(oneApi)
     })
     Promise.all(allApi).then(() => {
       this.loading = false
     })
   }
}

有异步处理数据时,按顺序执行函数

methods: {
    handleAdd (val) {
        this.addTag(val).then(() => {
          this.tags.push(this.newTag)
          this.editNote()
        })
    },
    addTag (val) {
      const data = {
        tag: val
      }
      return add(data).then(res => {
        this.newTag = {
          id: res.data.id,
          name: res.data.name
        }
      })
    },
    editNote () {
      const data = {
        tags: this.tags,
      }
      update(data).then((res) => {
        if (res.error_code === 0) {
          this.$message.success('修改成功!')
         }
      })
    }
}

使用return返回第一个异步处理的结果;使用then,继续执行第二个异步处理(当第一次返回结果为ture时)。

vue中Promise.all的使用

Promise.all

简述

Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。

注意: Promise.all成功结果数组里的数据顺序和Promise.all接收到的数组顺序是一致的。

所以在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

举例

let P1 = new Promise((resolve, reject) => {
  resolve('成功')
})
let P2 = new Promise((resolve, reject) => {
  resolve('success')
})
let P3 = Promse.reject('失败')
Promise.all([P1, P2]).then((result) => {
  console.log(result)     //控制台打印结果['成功了', 'success']
}).catch((error) => {
  console.log(error)
})
Promise.all([P1,P3,P2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // 控制台打印结果 '失败'
})

实战

这里实现的功能是调用后台接口返回数据实现全选反选

在这里插入图片描述

<template>
  <div class="table-container-wapper" id="apps-permission" v-loading="isTableLoading">
    <div class="func-btn">
      <el-button @click="selectInvert" class="invert">反选</el-button>
      <span class="cur">/</span>
      <el-button @click="selectAll" class="allSelect">全选</el-button>
    </div>
    <div class="choose">
      <div v-for="(item, index) in form" :key="index" class="select-list">
        <el-checkbox  v-model="item.select">{{ item.serviceName }}</el-checkbox>
      </div>
    </div>
    <div class="foot">
      <el-button class="cancel" size="small" @click="$router.back()">取 消</el-button>
      <el-button type="success" size="small" @click="submit">确 定</el-button>
    </div>
  </div>
</template>
<script>
import BaseMixin from "@/mixins/base";
import request from "@/utils/request";
import SETTING from "@/settings";
export default {
  mixins: [BaseMixin],
  data() {
    return {
      clientId: this.$route.query.id,
      form: [],
    };
  },
  created() {
    this.isTableLoading = true
    Promise.all([
      this.getServiceInfo(),
      this.getList()
    ]).then(([form, data]) => {
      let hasArr = data.map(item => item.serviceId)
      form.forEach(item => {
        if(hasArr.includes(item.id)) {
          item.select = true
        }else {
          item.select = false
        }
      })
      this.form = form
      this.isTableLoading = false
    }, _ => { 
      this.isTableLoading = false
    })
  },
  methods: {
    getServiceInfo() {
      return new Promise((resolve, reject) => {
        request({
          url: `${SETTING.IOT_APPLICATION}/serviceInfo`,
          params: {
            page: this.pagination.page - 1,
            size: 1000,
          },
        }).then(
          (res) => {
            if (res.code=== "200") {
              resolve(res.data.content)
            }
            reject()
          },
          (_) => {
            reject()
            this.$message({
              type: "error",
              message: _.message || "查询列表失败",
            });
          }
        );
      })  
    },
    getList() {
      return new Promise((resolve, reject) => {
        request({
          url: `${SETTING.IOT_APPLICATION}/sdkAppServiceRelation/curRights/${this.clientId}`,
        }).then(
          (res) => {
            if (res[SETTING.IOT_THING_MODEL_STATES] === "200") {
              resolve(res.data)
            }
            reject()
          },
          (_) => {
            reject()
            this.$message({
              type: "error",
              message: _.message || "查询列表失败",
            });
          }
        );
      })
    },
    //全选
    selectAll() {
      console.log(111)
      this.form.forEach((item) => {
        item.select = true;
      });
    },
    //反选
    selectInvert() {
      this.form.forEach((item) => {
        item.select = !item.select;
      });
    },
    //提交
    submit() {
      let ids = this.form.filter(item => item.select).map(item => item.id)
      request({
        url: `${SETTING.IOT_APPLICATION}/sdkAppServiceRelation/rights`,
        method: "post",
        data: {
          clientId: this.clientId,
          ids: ids
        }
      }).then(
        (res) => {
          if (res[SETTING.IOT_THING_MODEL_STATES] === "200") {
            this.$message({
              type: "success",
              message: res.msg || res.message ||  "操作成功",
            });
            this.$router.back()
          }
        },
        (_) => {
          reject()
          this.$message({
            type: "error",
            message: _.message || "查询列表失败",
          });
        }
      );
    },
  },
};
</script>
<style lang="scss" scope>
#apps-permission {
  max-width: 1000px;
  .func-btn {
    overflow: hidden;
    margin-top: 10px;
    .invert {
      border: 0px;
      padding: 0;
      float: right;
      font-size: 16px;
    }
    .cur {
      margin-left: 5px;
      margin-right: 5px;
      float: right;
      font-size: 16px;
    }
    .allSelect {
      border: 0px;
      padding: 0;
      float: right;
      font-size: 16px;
    }
  }
  .choose {
    display: flex;
    flex-wrap: wrap;
    .select-list{
      margin-bottom: 12px;
      width: 25%;
    }
  }
  .foot {
    display: flex;
    justify-content: flex-end;
    margin-top: 20px;
  }
}
</style>

扩展知识:Promise.race,哪个结果快就返回哪个

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue悬浮窗和聚焦登录组件功能实现

    Vue悬浮窗和聚焦登录组件功能实现

    这篇文章主要介绍了Vue悬浮窗和聚焦登录组件经验总结,​ 本文整理了实现悬浮窗以及聚焦登录组件的功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • vue源码解析之事件机制原理

    vue源码解析之事件机制原理

    这篇文章主要介绍了vue源码解析之事件机制原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • vue中v-model对select的绑定操作

    vue中v-model对select的绑定操作

    这篇文章主要介绍了vue中v-model对select的绑定操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue中的百度地图定位BMap.GeolocationControl的用法

    Vue中的百度地图定位BMap.GeolocationControl的用法

    BMap.GeolocationControl 是百度地图API中的一个类,用于添加地理定位控件到地图上,以便用户可以通过该控件获取自己的当前位置,本文给大家介绍Vue中的百度地图定位BMap.GeolocationControl的用法,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Vue条件循环判断+计算属性+绑定样式v-bind的实例

    Vue条件循环判断+计算属性+绑定样式v-bind的实例

    今天小编就为大家分享一篇Vue条件循环判断+计算属性+绑定样式v-bind的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue中选中多个选项并且改变选中的样式的实例代码

    vue中选中多个选项并且改变选中的样式的实例代码

    这篇文章主要介绍了vue中选中多个选项并且改变选中的样式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Vue 设置图片不转为base64的方式

    Vue 设置图片不转为base64的方式

    这篇文章主要介绍了Vue实现设置图片不转为base64的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • vue3使用vue-i18n的方法详解(ts中使用$t, vue3不用this)

    vue3使用vue-i18n的方法详解(ts中使用$t, vue3不用this)

    所谓的vue-i18n国际化方案就是根据它的规则自己建立一套语言字典,对于每一个字(message)都有一个统一的标识符,下面这篇文章主要给大家介绍了关于vue3使用vue-i18n(ts中使用$t, vue3不用this)的相关资料,需要的朋友可以参考下
    2022-12-12
  • axios简单实现小程序延时loading指示

    axios简单实现小程序延时loading指示

    这篇文章主要介绍了axios简单实现小程序延时loading指示,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • vue实现时间倒计时功能

    vue实现时间倒计时功能

    这篇文章主要为大家详细介绍了vue实现时间倒计时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论