vue循环中调用接口-promise.all();按顺序执行异步处理方式
作者:储储随记
这篇文章主要介绍了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,哪个结果快就返回哪个
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
