首页 > 其他分享 >vue中遇到的函数执行顺序问题

vue中遇到的函数执行顺序问题

时间:2023-11-18 22:44:17浏览次数:40  
标签:axios vue 函数 res 顺序 执行 data

vue中遇到的函数执行顺序问题

总结:vue中方法和方法间并未严格按照执行顺序执行的,可以使用asyncawait修饰符,使方法调用和执行是异步的。

vue中的方法调用顺序是依次进行的,方法体内部也是依次执行的, 但是,两个方法体的执行顺序并不能严格控制,也就是说,并不一定是先执行完第一个方法后再执行后一个。

可以这样理解:任务表上有两个任务,它们按顺序排列,方法调用顺序是依次进行的就是将这两个任务按照顺序依次发布给工作者,但因为工作者不止一个,所以第一个任务发布给第一个人,第二个任务给第二个人;又因为任务的复杂性不一致,所以每个人完成对应任务的时间不同,可能会出现第二个任务先完成、第一个任务后完成的情况,即执行顺序并不能严格控制

举个例子:函数B中需要使用一个变量T,这个变量T一开始是没有值的,执行函数A后变量T才有值,所以要先执行函数A,再执行函数B,一般情况下,CPU速度足够快,这并不会有问题。但在发送axios请求时,由于网络的不稳定,或者服务器的带宽不够等情况,会导致函数A所需的时间开销大于函数B,函数B已经执行完,并结束了,函数A还没完成,这显然会造成错误。

例如:

export default {
  name: 'xxx',
  data() {
    return {
        a: [],
        b: [],
        T: '',
    }
  },
  methods: {
    A() {
      this.$axios.get(this.$httpUrl + '/a/list').then(res => res.data).then(
          res => {
            console.log('A')
            if (res.code === 20041) {
              for(let i = 0; i < 10000; i++) {
                  this.a = res.data
              }
              T = res.data.length
          }
      )
    },
    B() {
      this.$axios.get(this.$httpUrl + '/b/list').then(res => res.data).then(
          res => {
            console.log('B')
            if (res.code === 20041) {
              this.b = T + res.data
            }
          }
      )
    }
  },
  mounted() {
    this.A()
    this.B()
  }
}


函数AB 都发送axios请求,但函数A 内存在一个无意义的循环代码(举例,夸张举例,正常情况不会出现这么愚蠢的代码),执行函数A 所需要的开销大于函数B ,虽然在mounted()中的顺序是先执行A,再执行B,但通过控制台可以发现,B先输出,A后输出。进一步推断:如果函数B中需要用到 通过函数A得到的值 时,显然会产生错误。

哪怕将函数A放在函数B中(代码如下),也并不会有作用。

export default {
  name: 'xxx',
  data() {
    return {
        a: [],
        b: [],
        T: '',
    }
  },
  methods: {
    A() {
      this.$axios.get(this.$httpUrl + '/a/list').then(res => res.data).then(
          res => {
            console.log('A')
            if (res.code === 20041) {
              for(let i = 0; i < 10000; i++) {
                  this.a = res.data
                  T = res.data.length
              }
          }
      )
    },
    B() {
      this.A()
      this.$axios.get(this.$httpUrl + '/b/list').then(res => res.data).then(
          res => {
            console.log('B')
            if (res.code === 20041) {
              this.b = T + res.data
            }
          }
      )
    }
  },
  mounted() {
    this.B()
  }
}

只不过之前是函数A和函数B不严格地按照顺序执行,而现在是在函数B中,方法Aaxios请求方法不严格地按照顺序执行。

为避免出现这种情况,可以使用asyncawait修饰符,使方法调用和执行是异步的。

代码如下:

export default {
  name: 'xxx',
  data() {
    return {
        a: [],
        b: [],
        T: '',
    }
  },
  methods: {
    A() {
      this.$axios.get(this.$httpUrl + '/a/list').then(res => res.data).then(
          res => {
            console.log('A')
            if (res.code === 20041) {
              for(let i = 0; i < 10000; i++) {
                  this.a = res.data
                  T = res.data.length
              }
          }
      )
    },
    async B() {
      await this.A()
      this.$axios.get(this.$httpUrl + '/b/list').then(res => res.data).then(
          res => {
            console.log('B')
            if (res.code === 20041) {
              this.b = T + res.data
            }
          }
      )
    }
  },
  mounted() {
    this.B()
  }
}

async表明该函数是异步函数。

await表示等待 —— await后面的函数运行完并且有了返回结果之后,才继续执行下面的代码。

注意: await关键字只能放到async函数里面

标签:axios,vue,函数,res,顺序,执行,data
From: https://www.cnblogs.com/ldh-blog/p/17841407.html

相关文章

  • python 数据可视化:直方图、核密度估计图、箱线图、累积分布函数图
    本文使用数据来源自2023年数学建模国赛C题,以附件1、附件2数据为基础,通过excel的数据透视表等功能重新汇总了一份新的数据表,从中截取了一部分数据为例用于绘制图表。绘制的图表包括一维直方图、一维核密度估计图、二维直方图、二维核密度估计图、箱线图、累计分布函数图。 目录......
  • vue3+cesium导入行者app的gpx轨迹数据
    软件版本:vue3.2cesium1.110.0vite:3.1.21)到行者APP的PC端官网下载gpx数据 2)将gpx文件放到项目里这里要将行者导出的gpx文件修改一下,把xmlns="http://www.topografix.com/GPX/1/0"改为xmlns="http://www.topografix.com/GPX/1/1" 3)代码内引入gpx文件 importtr......
  • vue通过表格当中的数据渲染表格
    <el-table-columnlabel="审核状态"width="120"><templateslot-scope="scope"><divv-if="scope.row.examStatus=='false'">未审核</div><divv-else......
  • 手撕Vue-Router-知识储备
    前言本文是手写Vue-Router的第一篇,主要是对Vue-Router的知识储备,为后面的手写做准备。那么VueRouter怎么实现呢?要想实现VueRouter,首先要知道VueRouter它的本质是什么。VueRouter的本质VueRoute的本质是什么?VueRouter的本质就是根据"不同的hash值"或者"不同的路......
  • 入门c语言--基于c库函数strstr的实现
    #include<stdio.h>#include<assert.h>char*my_strstr(constchar*p1,constchar*p2){ assert(p1&&p2);//检查p1和p2是否为空指针//创建s1,s2来在p1,p2中进行移动,创建指针tmp来保存开始移动时的s1的位置 char*s1=NULL; char*s2=NULL; char*tmp=(char*)p1;//对p1......
  • Vue的自定义指令
    在使用自定义指令的标签写入v-'自定义指令名'<template><divclass="box"v-loading="loading"></div></template>exportdefault{data(){return{loading:true}},} 公共配置,写在如main.js的公共js中Vue.di......
  • C字符输入输出函数
    ......
  • 创建顺序表(动态分配)
    #include<stdio.h>#include<stdlib.h>#defineInitSize10//默认的最大长度//定义结构体typedefstruct{ int*data; //指示动态分配的指针 intMaxSize; //顺序表的最大容量 intlength; //顺序表的当前长度}SqList;//初始化顺序表voidInitList(SqList&L){ L.d......
  • Python中四大高阶函数,你认识几个
    1.匿名函数defname(a,b):returna+bf=lambdaa,b:a+bprint(f(15,15))2.map函数第一个参数接收一个函数名,第二个参数接收一个可迭代对象,利用map,lambda表达式将所有偶数元素加100deffun(a,b):returna+bret=map(fun,[1,2,3],[4,5,6])print(list(ret))3.sor......
  • 复变函数
    一、复变函数的基本知识由于在实数域中无法表示负数开根号问题,故将数系进行扩充,定义有\(i^{2}=-1\)1.复数的表示法\[代数形式:z=x+iy\qquad其中i为虚部单位\]\[指数形式:z=re^{i\theta}\qquad其中r为其幅值,\theta为幅角\]\[三角形式:根据欧拉公式,有:z=r(\cos\theta......