【vue2】记录mounted里面某三个接口调完之后才能执行其他方法的写法

背景

vue2,异步操作并行运行

需求

某个页面现时需要一些接口请求回来的枚举值作为查询条件可供选择,然后将这些查询条件作为入参,请求列表数据。这就造成了我需要先调用枚举值接口,等枚举值接口调用完了,再调查询接口。

错误示例1

如下代码,我希望等this.getMapList()里面的接口全部调用完成后,再执行 this.handleMapData()和 thi.getList()。

async mounted() {
  await this.getMapList()
  this.handleMapData()
  this.getList()
},
methods() {
	// 这两是枚举值接口
	getIndustryList() {
	  service.queryIndustryStyleList().then(res => {
	    this.industryStyleList = res.result
	    console.log(this.industryStyleList, 'industryStyleList')
	    resolve()
	  }).catch(err => {
	    console.log('111', err)
	    this.industryStyleList = []
	    EMessage(err.error_info, 'error')
	  })
	},
	getInvestList() {
	  service.queryInvestStyleList().then(res => {
	    this.investStyleList = res.result 
	  }).catch(err => {
	    console.log('222', err)
	    this.investStyleList = []
	    EMessage(err.error_info, 'error')
	  })
	},
	getMapList() {
	  this.getIndustryList()
	  this.getInvestList()
	},
	// 这是列表接口
	getList() {
	  service.queryTableList({
		...this.form,
	  }).then(res => {
	    this.tableData = res.result
	  }).catch(() => {
		this.tableData = []
	  }) 
	},
	// 这是处理枚举值数据的方法
	handleMapData() {
	  this.industryStyleList = ...
	  this.investStyleList = ...
	}
},

我通常会像上面那样写,一直以来都没有什么问题,getList接口都是在两个枚举值接口之后调用的。但这次枚举值接口没通的情况下,我发现在对枚举值数据做处理的this.handleMapData()会先于this.getMapList()执行,这可能会出现不能及时更新枚举值数据。

错误示例2

我尝试把this.getMapList()放在created里面,期待created比mounted先调用,这样就可以保证 this.handleMapData()和 this.getList()一定是在后执行的了

async created() {
    await this.getMapList()
 
},
async mounted() {
	this.handleMapData()
	this.getList()
},

但是!!!在vue的生命周期钩子中,created 和 mounted 是两个不同阶段的钩子,created 先于 mounted,且它们是异步执行的。尽管created的await会暂停created内部代码的执行知道getMapList解决,但这并不影响mounted的执行时机。created钩子中的await只会影响created钩子内的代码执行顺序,mounted钩子会按预期在created后执行,而不会等待created钩子中的异步操作完成。

正确写法

1、首先要确保this.getMapList()里面的两个接口是异步执行的,因为他两谁快谁谁慢都无所谓,只要在this.handleMapData()执行前拿到数据就行。所以getInvestList和getIndustryList的接口调用绝对不能使用try catch,因为那样会造成必须等getIndustryList执行完才能执行getInvestList

2、我期望并行的运行getInvestList和getIndustryList,并等待他们全部全部完成。这就可以用Promise.all()

3、Promise.all()接受一个promise数组作为输入,并会返回一个新的promise,这个新的promise会在所有输入的promise都成功解决后解决,其解决值是一个数组,包含了所有输入promise的解决值(按相同的顺序),如果输入的任何一个promise被拒绝,则返回的promise会立即被拒绝,并带有第一个被拒绝的理由。

4、由于Promise.all()输入的一个promise被拒绝,但其他promise可能成功,所以我选择把在每个请求的.catch中做错误处理,这样无论Promise.all()里的请求是否成功,都会在全部完成后执行this,handleMapData()和this.getList()

async mounted() {
  try {
    const promises = [  
      // 必须在这.catch,这样才能无论成功与否都执行handleMapData和getList
      this.getIndustryList().catch(() => {}),  	
      this.getInvestList().catch(() => {}),  
    ]
    await Promise.all(promises)

    this.handleMapData()
    this.getList()
  }catch(err) {}
},
methods: {
    getIndustryList() {
      return service.queryIndustryStyleList().then(res => {
        this.industryStyleList = res.result
      }).catch(err => {
        console.log('111', err)
        this.industryStyleList = []
        EMessage(err.error_info, 'error')
      })
    },
    getInvestList() {
      return service.queryInvestStyleList().then(res => {
        this.investStyleList = res.result 
      }).catch(err => {
        console.log('222', err)
        this.investStyleList = []
        EMessage(err.error_info, 'error')
      })
    },
   	// 这是列表接口
	getList() {
	  service.queryTableList({
		...this.form,
	  }).then(res => {
	    this.tableData = res.result
	  }).catch(() => {
		this.tableData = []
	  }) 
	},
	// 这是处理枚举值数据的方法
	handleMapData() {
	  this.industryStyleList = ...
	  this.investStyleList = ...
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/770564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot私人诊所管理系统-计算机毕业设计源码93887

摘要 随着科技的不断发展和医疗服务的日益普及,私人诊所管理系统成为现代医疗管理的重要组成部分。该系统通过引入计算机技术和互联网平台,为患者提供方便快捷的就诊方式,同时也为诊所、医院提供高效的资源管理和服务优化的途径。本文将介绍私…

Jlink调试的时候提示擦除超时,programming failed @ address 0x0804000

如果能正常下载进单片机,但是调试提示上面的信息。是keil的问题,把所有断点都取消了再调试就好了

Mybatis入门の基础操作

1 Mybatis概述 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的…

JavaScript中的this指向

1. 全局环境下的this 在全局环境中(在浏览器中是window对象,在Node.js中是global对象),this指向全局对象。 console.log(this window); // 在浏览器中为true console.log(this.document ! undefined); // true,因为…

若依前后端分离 前端路由登录页 如何进行跳转

路由守卫,看这篇文章 http://t.csdnimg.cn/HkypThttp://t.csdnimg.cn/HkypT

LLM推理引擎性能评测对比:vllm、lmdeploy、tensorrt-llm

01 简介 在当今LLM时代,大模型的效果已经取得了长足的进步,逐渐成为业务流程中的重要部分,因此对性能进行评估变得至关重要,由于目前LLM推理都需要比较高级的GPU,使得LLM推理成本高,因此在不同使用场景下…

VS2019+QT VS tools:Debug下ok,relese下报错

报错界面 踩得坑: 尝试一下重装 QT VS tools,结果装不上。 尝试卸载原来的QT VS tools:卸载方法,到下面文件夹下可以看到有两个文件夹,分别是两个插件,找到QT的插件,删除文件夹即可。但是删除…

基于深度学习网络的USB摄像头实时视频采集与火焰检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放火焰的显示器,然后进行识别,识别结果如下: 本课题中&#x…

实验七 SQL数据更新和视图

题目 (1)向商品类别表category中插入一条记录(801,‘座椅套’,‘各种品牌的汽车座套’) (2)向商品表product中插入一条记录:商品编号80101,商品名称“四季通…

汽车免拆诊断案例 | 2021款路虎揽胜运动版车遥控及一键起动功能失效

故障现象 一辆2021款路虎揽胜运动版车,搭载AJ20-P6H3L发动机,累计行驶里程约为2.5万km。车主反映,使用智能钥匙无法解锁车门,使用机械钥匙打开车门,进入车内,发现一键起动功能也失效;根据组合…

电脑录制视频的软件,电脑录制,4款免费软件推荐

在数字化时代,电脑录制视频的软件已成为我们日常生活和工作中的得力助手,这些软件可以帮助我们轻松捕获到屏幕上的精彩瞬间。但同时市面上的录制视频软件也层出不穷,让人不知该如何选择。到底怎样才能选择到一款适合自己的录屏软件呢&#xf…

实验4 宏指令及子程序设计实验

从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在屏幕上显示出来。 要求: 1)在屏幕上显示字符串提示信息的功能由宏指…

基于单片机的出租车计价器实验教学案例设计

摘 要 为了让学生加深单片机的理解,加强学生的单片机技术应用、实践动手、创新能力的培养,根据单片机课程设计教学情况精心设计了基于单片机的出租车计价器实验教学案例。本教学案例的基本原理是速度的检测,里程、价格的计算和显示。学生通…

Pylons 和 Flex 3

“Pylons” 和 “Flex 3” 是两个不同的技术,各自有着不同的背景和应用场景: Pylons Pylons 是一个 Python Web 框架,用于快速开发 Web 应用程序。它强调简单性、灵活性和可扩展性,以便开发人员能够快速构建和部署功能强大的 We…

如何在Linux上删除Systemd服务

Systemd是Linux 操作系统的系统和服务管理器,提供控制系统启动时启动哪些服务的标准流程。 有时,您可能出于各种原因需要删除systemd服务,例如不再需要、与其他服务冲突,或者您只是想清理系统。 Systemd使用单元文件来管理服务&…

【Linux】虚拟机安装 openEuler 24.03 X86_64

目录 一、概述 1.1 openEuler 覆盖全场景的创新平台 1.2 系统框架 1.3 平台框架 二、安装详细步骤 一、概述 1.1 openEuler 覆盖全场景的创新平台 openEuler 已支持 x86、Arm、SW64、RISC-V、LoongArch 多处理器架构,逐步扩展 PowerPC 等更多芯片架构支持&…

行车记录打不开:故障深度解析、恢复策略与预防指南

一、行车记录打不开的困境概述 行车记录仪,作为现代驾驶安全的重要辅助工具,不仅记录着每一次出行的点滴,更在关键时刻成为维护权益的关键证据。然而,当车主满怀期待地想要回顾或分享这些记录时,却遭遇了行车记录打不…

Tomcat服务部署安装

一、Tomcat基础 1.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常…

存储器类型介绍

存储器 ROM 我们一般把手机和电脑的硬盘当作ROM。ROM的全称是:Read Only Memery,只读存储器,就是只能读不能写的存储器。但是现在的ROM不仅可以读,还可以写数据,比如给手机下载APP,就是给手机上的ROM写数据…