ES6 - async&await

198 阅读1分钟

几种异步处理方案的对比

  1. promise:
    const fs = require('fs'); //nodeJs
    //简单封装,fs封装成一个promise
    const readFile = function(filename){
        return new Promise((resolve,reject)=>{
            fs.readFile(fileName,(err,data)=>{
                if(err) reject(err);
                resolve(data);
            })
        })
        
    }
    
    //promise
    readFile('data/a.txt').then(res=>{
        console.log(res.toString());
        return readFile('data/b.txt')
    }).then(res=>{
        console.log(res.toString())
    })
    
2. generator:
    ```
    function * gen(){
        yield readFile('data/a.txt');
        yield readFile('data/b.txt');
        yield readFile('data/c.txt');
    }
    let g1 = gen();
    g1.next().value.then(res=>{
    console.log(res.toString())
    return g1.next().value;
    }).then((res=>{
    console.log(res.toString())
    return g1.next().value;
    })
    ```
3. async
    ```
     const fs = require('fs'); //nodeJs
    //简单封装,fs封装成一个promise
    const readFile = function(filename){
        return new Promise((resolve,reject)=>{
            fs.readFile(fileName,(err,data)=>{
                if(err) reject(err);
                resolve(data);
            })
        })
        
    }
    
    //async
    async function fn(){   //表明函数里面有异步顺序
        let f1 = await readFile('data/a.txt');  //表示后面结果需要等待
        console.log(f1.toString());
        let f2 = await readFile('data/a.txt')
        console.log(f2.toString());
        let f3 = await readFile('data/a.txt')
        console.log(f3.toString());
    }
    fn();

async特点

  1. await只能放在async函数里面
  2. 相比generator语义化更强
  3. await 后面可以是promise对象,也可以是数字,字符串,布尔值
  4. async函数返回的是一个promise对象
  5. 只要await语句后面promise状态变成reject,那么整个async函数会中断执行;
  6. 如何解决async函数抛出错误,影响后续代码执行
    • 用try catch解决;(推荐,任何async 地方,最好都用try-catch)
    • promise.catch;