使用Promise.all来并行调用多个异步函数;依次同步调用函数
2023-12-29 18:34:23
场景: 在一个 vue页,有个form表单数据需要使用到三个后端接口返回的数据(常见的就是详情回显,需要下拉数据),要求拿到三个接口返回的数据后,再赋值给表单form。
总结:将方法从同步执行改为并行执行的过程
一、原始同步执行方式–依次执行–慢
在原始代码中,dictCode()
、virtualMachineDataList()
和serviceDataList()
这三个方法调用后端数据被依次执行,即在一个方法的then中或await后调用下一个方法。这种同步执行方式可能导致性能问题,导致页面加载loading时间特别长,特别是在处理大量数据时,因为每个方法都需要等待上一个方法执行完成后才能开始执行。
修改前代码:
const dictCode = async(codeList) => {
try {
const data = await dictCodeList({ })
return data
} catch {
return {}
}
}
const virtualMachineDataList = async() => {
try {
const data = await virtualMachineApi({ virtualMachineName: null })
return data
} catch {
return {}
}
}
const serviceDataList = async() => {
try {
const data = await serviceApi({ serviceName: null })
return data
} catch {
return {}
}
}
const generateLayout = async(mode, activeNode, option) => {
// 为了确保拿到三个接口数据 而依次执行(类似then嵌套)---导致lodaing加载过长
const dictValueList = await dictCode(codeList) || []
const hostList = await virtualMachineDataList() || []
const serviceList = await serviceDataList() || []
// 使用dictValueList、hostList、serviceList数据
// 此时再使用dictValueList.map hostList.map serviceList.map
// 给form赋值 return form
}
二、 解决方案:
修改为并行执行
原三个方法不变动,我们只需将这三个方法放在了Promise.all
中进行并行执行。这样可以确保这三个方法同时开始执行,而不需要等待上一个方法的执行结果。这样做可以显著提高性能,尤其是在处理大量数据或网络请求时。
Promise.all()提供了并行执行异步操作的能力。并且在所有异步操作执行完成以后,才执行回调。
Promise.all()详细使用方法参考此篇
修改后:通过network可以发现三个接口是同时调用的
const dictCode = async(codeList) => {
try {
const data = await dictCodeList({ })
return data
} catch {
return {}
}
}
const virtualMachineDataList = async() => {
try {
const data = await virtualMachineApi({ virtualMachineName: null })
return data
} catch {
return {}
}
}
// 可以给第二个方法设置延时触发 更明显看到三个方法是并行执行效果
// const virtualMachineDataList = async() => {
// return new Promise((resolve, reject) => {
// setTimeout(async() => {
// try {
// const data = await virtualMachineApi({ virtualMachineName: null })
// resolve(data)
// } catch (error) {
// reject(error)
// }
// }, 5000)
// })
// }
const serviceDataList = async() => {
try {
const data = await serviceApi({ serviceName: null })
return data
} catch {
return {}
}
}
const generateLayout = async(mode, activeNode, option) => {
// 并行调用三个异步函数--分别获取到三个接口返回的数据 参数数据和[]数组里调用方法返回的对应
const [dictValueList, hostList, serviceList] = await Promise.all([
dictCode(codeList),
virtualMachineDataList(),
serviceDataList()
])
// 使用dictValueList、hostList、serviceList数据
// 此时再使用dictValueList.map hostList.map serviceList.map
// 给form赋值 return form
}
问题解决
通过将方法改为并行执行,我们解决了以下问题:
- 性能瓶颈:原来的同步执行方式可能导致性能瓶颈,特别是在处理大量数据或网络请求时。并行执行可以提高性能,减少整体执行时间。
- 并行性:通过并行执行,我们确保了这三个方法可以同时开始执行,而不需要等待上一个方法的执行结果。这提高了并行性,有助于提高系统的吞吐量和响应速度。
结论
通过将方法从同步执行改为并行执行,我们解决了性能瓶颈和并行性的问题,提高了系统的性能和响应速度。这种修改对于处理大量数据或网络请求的场景特别有帮助。
文章来源:https://blog.csdn.net/i_am_a_div/article/details/135294547
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!