全栈课程03 ES6(2)

2018-10-29

promise

  • 目的:解决异步操作复杂性问题
  • 同步——串行 简单、方便
  • 异步——并发 性能高、体验好

Promise基本用法

  let p=new Promise((resolve, reject)=>{
    resolve();
    reject();
  });

  // the two function params in then are just resolve and reject
  p.then(()=>{}, ()=>{}); 

Promise.all()与Promise.race()

这两个静态方法可以实现让多个异步操作放在一起

Promise.all([promise1, promise2, promise3])
.then(resArr => {})
.catch(reason => {});
  • all,需要所有异步操作成功以后才算成功
  • race,只要一个异步操作成功就可以

局限

Promise对于有依赖的异步操作嵌套仍然不方便

外话

回调轮询是一对概念,前者更简便与节省资源。

generator

一种可以中途暂停,分段执行的函数。

基本使用

function * show(){
    console.log('a');
    yield;
    console.log('b');
}

let gen = show();
gen.next(); // a
gen.next(); // b

yield传参与返回值

function * show(){
    console.log('a');
    let a = yield 23;
    console.log(a);
}

let gen = show();
let res1 = gen.next(); // a
let res2 = gen.next(12); // 12
console.log(res1); // {value: 23, done: false} 
console.log(res2); // {value: undefined, done: true}

generator与promise配合

  • 需要外来的辅助封装执行——不统一、不标准、性能低
  • generator函数不能写成=>

因此generator使用时间很短,是promiseasync/await的过渡,现在并不常用。

async/await

基本使用

async function show(){
    console.log('a', Date.now());

    await new Promise((resolve, reject) => {
        setTimeout(resolve, 2000);
    });

    console.log('b', Date.now());
}

show();

await后可以放Promise对象、generator函数、async/await函数,即使后面不是同步操作,运行也会是异步的,类似setTimeout(func, 0)的效果。

用于ajax

(async ()=>{
    let data1 = await $.ajax({url: './data/a.json', dataType: 'json'});
    if(data1.a > 2){
        let data2 = await $.ajax({url: './data/b.json', dataType: 'json'});
    }else{
        let data3 = await $.ajax({url: './data/c.json', dataType: 'json'});
    }
})();

错误处理

try-catch

工程化相关

  • 兼容低版本浏览器:将ES6编译为ES5(工具babel)
  • 问题:这些高级语法最终是要经过编译的,那么如果直接使用基础的语法写,避免编译,对性能有提升吗?
    • 首先,对于前端程序,各评价指标大致优先级是:用户体验、健壮性、可读可维护工程性、性能
    • 在性能方面,分为网络性能和执行性能,而前者的影响远大于后者
    • 为此使用高级语法整体性能反而更高些。
  • babel,ES6->ES5编译工具
  • Node
    • 语言、环境、平台,开发中的中间层
    • web后台(小规模)
    • 工具(grunt,gulp等都是基于它的)
  • npm,node包管理(node package manager)
    • 自动下载、升级
    • 自动下载依赖包
    • npm原版慢,cnpm淘宝源:http://npm.taobao.org/

(本文完)

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。