方法分发管理与异步 与 async await 的运用情景

前置:
1.map foreach
2async await :https://segmentfault.com/a/1190000007535316
场景是这样的:
一个页面,有6个echart,都可以点击进去看详情。(6个图接口,6个详细图接口)
如果用垃圾写法就是:
写12个方法
高级一点:
用flag标示出进的是哪个图的,然后switch case 1 2 3 。。。
再好一点的写法:方法分发管理
在data中保存一个对象,这个对象有6个属性,属性值分别为6个方法

echartsObj: {
        f1: (e = 'f1') => this.initF1(e),
        f2: (e = 'f2') => this.initF2(e),
        f3: (e = 'f3') => this.initF3(e),
        f4: (e = 'f4') => this.initF4(e),
        f5: (e = 'f5') => this.initF5(e),
        f6: (e = 'f6') => this.initF6(e)
      },

在调后台接口的时候就有异步的问题了。
也就是initF1怎么写:

async initF1(){
	访问接口 await xxxxxxx
	let res
	画图参数
	return res//这个返回值用于画图
}
async initF2(){
...........
async initF6(){

第一步:刚进页面init时候:

getDataList () {
      Object.values(this.echartsObj).forEach(async (v) => {
        const e = await v()
        this.画echart(e)
      })
      // Promise.all(Object.values(this.echartsObj).map(async(v) => {
      //   const e = await v()
      //   this.initEcharts(e.name, e.option)
      // }))
      // 这种map的要多套一层promise(ES6)是因为map不支持异步,所以麻烦一点
    },

这里遍历了方法对象的所有属性,所以是依次调用存放在方法对象里的方法。

第二步:点详情,重新绘制详情的图

async getDetail (val) {//例如val = initF1
      const {name, option} = await this.echartsObj[val]('detailEchart')
      //从此获得了F1中的画图参数+返回值
      增加详细版的画图参数
      this.画echart(所有参数)
    }

以下是思路图
请添加图片描述
至于为什么第一步不用async,第二步用了async。(要调用async就要await,有await就要它函数名前是async的这个死循环)这个括弧内的死循环基本是正确的但是有一种例外情况。
首先,async的使用情景包含await的使用情景,也就是async可以单用,但是await一用就要用async。以下讨论不适用与async单用时候。
、、
await的作用就是一个运算符。
1.1如果await后面跟的不是一个promise,也能运行,但是eslinet会认为你再浪费资源,给你报错提示,但是依旧是可以运行的。
1.2如果await后面跟的是promise,他就会阻止后面代码的运行,等待他运行完。这时候,如果你写了一个需要等待的异步代码,而不用await,就会只返回一个promis pendding(正在运行中)。所以加上await,等它运行完了再去地址寻值。
2.1用了await就要让他所处的代码块为async。
2.2那写了异步以后就要循环套了?(这时候接着往下思考就会陷入上面说的套用函数时候出现的死循环)不是的。出现了异步代码,也不一定需要用等待。只有我们要用到返回值的时候,才需要等待。如例子中的1中的一部分(分发部分),6步分发,不在乎返回值,不需要等待。例子2,需要等待,才加await

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值