JS的异步编程过程中的问题集锦、echarts使用记录。

描述一下今天的业务场景

为了方便维护,在JS里的把html模板和业务逻辑做了分离,在业务逻辑里向模板对象传递指定的data对象返回生成好的html,以往的数据对象是用户交互产生的,今天需要改成从接口拉取。

按照以往的逻辑,获取用户的交互数据,传递给模板。基本上是同步的,今天修改的时候为了不触碰原有的代码,把网络请求单独放在了其他对象里,业务流程变成了,调用网络请求函数产生的返回值作为数据对象传递给模板对象。

一切看似没问题,结果模板解析的时候数据对象能正常打印显示数据对象,但是输出的html是空的。研究了好一会,才发现没考虑异步的问题(JS遇见异步函数,放进执行队列,不等待它执行完成,而直接执行后面的代码);

数据对象在网络请求没完成的时候,已经开始解析模板了。(但是这个打印的时候有正常数据被打印,这就比较迷了),通过debugger断点,得知data是空的。然后就是改进了:

  1.  将模板调用往后的业务逻辑放在网络请求的回调函数,。
  2. 使用promise对象,请求完毕的回调函数内调用resolve传递数据,然后在promise的then方法里调用模板对象之后的业务逻辑;
  3. await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,获取async函数的返回值可通过await;

echarts使用记录

图例(legend)、标题(title)、文字提醒(tooltip)、表格类型和样式(serial)、坐标系(Grid)、x轴(xAxis)、Y轴(yAxis)、样式(itemStyle、areaStyle、lineStyle)

1.配置项说明

  1. title,标题组件,包含主标题和副标题。
  2. legend,图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。
  3. grid ,代表整个坐标系的配置,直角坐标系内绘图网格,单个 grid 内最多可以放置上下两个 X 轴,左右两个 Y 轴。
     grid:{
         left:"5%",
         top:"5%",
         right:"5%",
         bottom:"8%"
    }
    
  4. xAxis,直角坐标系 grid 中的 x 轴,一般情况下单个 grid 组件最多只能放上下两个 x 轴,多于两个 x 轴需要通过配置 offset 属性防止同个位置多个 x 轴的重叠。
  5. yAxis,直角坐标系 grid 中的 y 轴,一般情况下单个 grid 组件最多只能放左右两个 y 轴。
  6. dataZoom ,用于区域缩放,从而能自由关注细节的数据信息,或者概览数据整体,或者去除离群点的影响。
  7. tooltip,数据提示框组件。
  8. color,调色盘颜色列表。如果系列没有设置颜色,则会依次循环从该列表中取颜色作为系列颜色。
  9. textStyle,全局字体样式。
  10. series,设置图表的数据及类型和样式。
    series: [{
        name: 'Funnel',
        type: 'funnel',
        left: '10%',
        top: 0,
        bottom: 0,
        width: '50%',
        min: 0,
        max: 100,
        minSize: '0%',
        maxSize: '100%',
        sort: 'descending',
        gap: 2,
        label: {show: true, position: 'inside'},
        labelLine: {length: 10, lineStyle: {width: 1, type: 'solid'}},
        itemStyle: {borderColor: '#fff', borderWidth: 1},
        emphasis: {label: {fontSize: 20}},
        data: [{value: 50, name: '发起申请'}, {value: 60, name: '新增好友数'}, {value: 70, name: '主动触达数'}, {
            value: 80,
            name: '互动数'
        }, {value: 90, name: '有效互动数'}],
    }]
    
    1. label ,图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
    2. type,定义图表的类型。

2.渐变内置生成器echarts.graphic.LinearGradient

 series: [
            {
                name: '发起申请',
                type: 'line',
                smooth: true,
                showSymbol: false,
                stack: 'Total',
                areaStyle: {
                    opacity: 0.5,
                    color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
                        {
                            offset: 0,
                            color: '#5768FF10'
                        },
                        {
                            offset: 1,
                            color: '#5768FF'
                        }
                    ])
                },
                data: [20, 20, 40, 40, 50, 50, 60, 60, 70, 70, 80, 80, 90, 90]
            }
        ]

前4个参数用于配置渐变色的起止位置, 这4个参数依次对应右/下/左/上四个方位. 而0 0 0 1则代表渐变色从正上方开始.
第5个参数则是一个数组, 用于配置颜色的渐变过程. 包含offset和color两个参数. offset的范围是0 ~ 1, 用于表示位置, color表示颜色

JS Api

1.Notifications API 接口用于向用户配置和显示桌面通知。

Notification.requestPermission().then(function (permission) {
      // 如果用户接受权限,我们就可以发起一条消息
      if (permission === "granted") {
         var notification = new Notification("Hi there!");
      }
});

2.全屏Api:https://developer.mozilla.org/zh-CN/docs/Web/API/Fullscreen_API

3.网页性能相关的API:https://developer.mozilla.org/zh-CN/docs/Web/API/Navigation_timing_API

4.JS异步编程:https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Asynchronous

全屏切换

 /*是否处于全屏*/
if (!document.fullscreenElement) {
    document.documentElement.requestFullscreen();
} else {
   /*接口是否可用*/
    if(document.exitFullscreen) {
       document.exitFullscreen();
    }                                      
}

宏任务、微任务

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程的不阻塞,Event Loop 的方案应用而生。Event Loop 包含两类:一类是基于 Browsing Context,一种是基于 Worker。二者的运行是独立的,也就是说,每一个 JavaScript 运行的"线程环境"都有一个独立的 Event Loop,每一个 Web Worker 也有一个独立的 Event Loop。

相关文章:https://zhuanlan.zhihu.com/p/78113300