利用Promise实现数据多个请求加载完成时执行某个方法

在JavaScript开发中,处理多个异步接口请求时,Promise提供了解决方案。Promise.all允许并发执行请求,当所有请求都成功完成时,再执行后续逻辑,避免了回调地狱和延迟问题。本文通过实例代码讲解如何利用Promise.all实现多个数据请求加载完成后的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发中常常有些业务的数据是来自多个接口的,因为ajax是异步,这样就导致我们需要判断是否请求到了数据然后在做其他的逻辑,在Promise没有出现之前,通常我们的解决方法是,第一粗暴的改异步为同步,但这样会造成阻塞,异步好像又失去了意义,第二也就是大家常用的解决办法用回调既一个异步执行完成后在执行下一个请求,这样看比第一种要好太多了,但是问题又来了,延迟延迟延迟,请求越多最后的那个请求延迟就会越严重,而且这样请求多了之后逻辑就会变得很乱。。。痛苦不堪,还好es6带来的Promise正好能解决这个东西,关于Promise具体详情请百度,这里大致只说三个东西,resolve, reject,Promise.all 对应成功执行,失败执行,返回全部状态,实例贴代码 很容易理解。

const promist = new Promise((resolve, reject) => {
              this.$http.jsonp(getRegionNameByIdApi, {params: {regionId: dqarr}}).then((res) => {
                this.dqarr = res.body.data
                resolve(res.body.data)
              }, (err) => {
                console.log(err)
              })
            })
            const promist1 = new Promise((resolve, reject) => {
              this.$http.jsonp(getPartnerNameByIdApi, {params: {partnerId: sharr}}).then((res) => {
                this.sharr = res.body.data
                resolve(res.body.data)
              }, (err) =>
<think>根据用户需求,需要在Vue3中实现一个方法:当该方法中的Promise执行,禁用其他按钮,直到Promise执行完毕后再启用其他按钮。这样可以防止用户在操作未完成重复触发。解决方案思路:1.使用一个ref变量(如`isLoading`)来标记Promise执行状态。2.在Promise开始执行将`isLoading`设为true,表示正在执行,此禁用其他相关按钮。3.在Promise执行结束后(无论成功或失败)将`isLoading`设为false,重新启用按钮。4.在按钮上通过`:disabled`属性绑定`isLoading`的值,实现禁用状态。参考引用[3]和[4]中的做法,它们分别通过状态变量控制按钮的禁用,并在异步操作完成后更新状态。具体实现步骤:步骤1:在Vue组件中定义一个响应式变量`isLoading`,初始值为`false`。步骤2:将需要控制的方法包装一下,在方法内部设置`isLoading`为`true`,然后执行Promise,并在finally中设置`isLoading`为`false`。步骤3:在模板中,为需要禁用的按钮绑定`:disabled="isLoading"`。示例代码:```vue<template><div><button@click="submitForm">提交</button><button:disabled="isLoading"@click="otherAction">其他操作</button></div></template><scriptsetup>import{ref}from'vue';constisLoading=ref(false);constsubmitForm=()=>{isLoading.value=true;//模拟一个异步操作,比如API请求newPromise((resolve,reject)=>{setTimeout(()=>{//模拟成功或失败Math.random()>0.5?resolve():reject(newError('错误'));},1000);}).finally(()=>{isLoading.value=false;});};constotherAction=()=>{console.log('其他操作');};</script>```在上面的代码中,当点击“提交”按钮,会触发`submitForm`方法,该方法开始执行Promise,同将`isLoading`设置为`true`,此另一个按钮“其他操作”会被禁用(因为`:disabled="isLoading"`)。当Promise执行完毕(无论成功或失败)后,在`finally`块中将`isLoading`重置为`false`,按钮恢复可用。注意:如果有多个按钮需要同禁用,可以将它们都绑定到同一个`isLoading`变量上。如果需要更细粒度的控制(例如只禁用部分按钮),可以定义多个状态变量,或者使用一个对象来管理不同按钮的状态。参考引用[4]中的做法,在异步操作开始和结束(finally)更新按钮禁用状态,这样可以确保无论成功或失败都会更新状态。另外,引用[5]中提到了基于Vuex(或Pinia)的权限控制,但这里的需求是临禁用而非权限控制,因此使用局部状态即可。如果希望在整个应用多个组件中共享这个状态,可以考虑使用状态管理(如Pinia),但根据问题描述,似乎只需要在单个组件内控制。因此,上述方案是简单有效的。相关问题:1.如何防止用户重复提交表单?2.Vue3中如何处理多个异步操作的并发控制?3.如何全局控制按钮的禁用状态?</think>### Vue3中实现Promise执行期间禁用其他按钮的解决方案 在Vue3中实现"当Promise执行期间禁用其他按钮"的功能,可以通过响应式变量控制按钮状态。核心思路是:**使用`ref`创建加载状态变量,在Promise执行前后更新该状态,并通过该状态控制按钮的`disabled`属性**。 #### 实现步骤: 1. **定义加载状态变量** ```javascript import { ref } from 'vue'; const isLoading = ref(false); // 控制按钮禁用状态 ``` 2. **包装异步方法** ```javascript const executeTask = async () => { isLoading.value = true; // 开始执行禁用按钮 try { await yourPromiseMethod(); // 执行实际的Promise方法 } catch (error) { console.error('执行失败:', error); } finally { isLoading.value = false; // 无论成功失败都恢复按钮状态 } }; ``` 3. **模板中绑定按钮状态** ```vue <template> <button @click="executeTask" :disabled="isLoading"> {{ isLoading ? '执行中...' : '开始任务' }} </button> <button :disabled="isLoading">其他操作1</button> <button :disabled="isLoading">其他操作2</button> </template> ``` #### 优化方案: 1. **自动恢复机制**(防止Promise未处理异常) ```javascript // 使用finally确保状态恢复 const safeExecute = () => { isLoading.value = true; yourPromiseMethod() .finally(() => isLoading.value = false); }; ``` 2. **多按钮独立控制**(使用对象管理状态) ```javascript const btnStates = ref({ main: false, btn1: false, btn2: false }); // 使用 <button :disabled="btnStates.main">主按钮</button> ``` 3. **全局状态管理**(使用Pinia) ```javascript // store/loading.js export const useLoadingStore = defineStore('loading', () => { const isBlocking = ref(false); return { isBlocking }; }); // 组件中使用 import { useLoadingStore } from './store/loading'; const loadingStore = useLoadingStore(); <button :disabled="loadingStore.isBlocking">全局控制按钮</button> ``` #### 注意事项: 1. 当使用`async/await`,**务必将状态更新放在`finally`块**中,确保即使发生异常也能恢复按钮状态[^4] 2. 对于表单提交场景,可结合`formLoading`等状态实现更精细的控制[^3] 3. 如果涉及权限控制,可组合使用`v-permission`指令和状态管理[^5] > **数学表达式示例**:当禁用状态为真,设按钮状态为 $$S_{disabled} = \\{ \\forall b \\in B \\mid b.disabled = true \\}$$,其中 $B$ 是所有按钮的集合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值