ES6 - Promise, Generator, async(非同步操作)使用比較

weixin_33766168發表於2019-02-24

導讀:

  • 分別使用Promise, Generator, async三種非同步操作讀取檔案,async無論是語義化 / 程式碼優雅都有很大優勢。

例子:

const fs = require('fs');

// 簡單封裝   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/1.txt').then(res =>{
    console.log(res.toString());
    return readFile('data/2.txt');
}).then(res =>{
    console.log(res.toString());
    return readFile('data/3.txt');
}).then(res =>{
    console.log(res.toString());
});

// generator
function* gen() {
    yield readFile('data/1.txt');     // 使用next().value返回的是Promise物件,故順序呼叫時方法同Promise
    yield readFile('data/2.txt');
    yield readFile('data/3.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;
}).then(res =>{
    console.log(res.toString());
})

// async 
async function fn() {     
    let [a, b ,c] = await Promise.all([    
     // 由於不指定檔案順序,使用Promise.all(),指定順序分開使用await,注意: 使用await最好加上try{}catch(e){}
        readFile('data/1.txt'), 
        readFile('data/2.txt'), 
        readFile('data/3.txt')
    ]); 
    console.log(a.toString());
    console.log(b.toString());
    console.log(c.toString());
}
fn();
  • 執行結果:


    15204173-a652bc26c42e14a8.png
    Result

總結:

  • async特點:
    1. await只能放到async函式中
    2. 相比gengerator語義化更強
    3. await後面可以是promise物件,也可以是數字,字串等
    4. async函式返回值是一個promise物件
    5. 只要await語句後面promise狀態變成了reject,整個async函式會中斷執行, 故一般使用try{}catch(e){}包裹

相關文章