ES6 - async&await

貓董發表於2018-12-18

幾種非同步處理方案的對比

  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;