async 、 await

在了解 async 、 await 之前你必須先了解原生 ES6 的 Promise,不了解的朋友可以先去了解一下。
雖然兩個常常一起用,但他是兩個完全可以拆開的應用。
所以接下來我會將他們兩個分開來講,最後在合併一起應用

async

async,可以用來標註 function 讓 function 被一層 promise 包住

async function a() { return 1; } function b(){ return new Promise(function(resolve, reject) { resolve(1); }); } console.log(a(), b());

基本上a和b的效果是一樣的,都是返回一個 promise

await

他必須在async內使用,功效是解開一層 Promise

async function a(){ var ans = await new Promise(function(resolve, reject) { resolve(1); }); console.log(ans); } a();

async & await

由於async可以產生 Promise ,而 await 可以解開一層 Promise,所以我們可以將兩者混再一起用

async function a(){ return 1; } async function b(){ var ans = await a(); return ans; } b().then(function(r){ console.log(r); });

注意

由於async 會等待 await 執行完才繼續執行,所以千萬要考慮效能問題

function delay(time) { return new Promise(function(resolve, reject){ setTimeout(function(){ resolve(); }, time); }); } async function runA() { await delay(1000); await delay(1000); console.log("執行到這裡已經是兩秒後了"); } runA();

所以如果兩個 proimse 毫不相關,事實上可以同時去執行 promise 之後再一起 await

async function runB() { var p1 = delay(1000); var p2 = delay(1000); await p1; await p2; console.log("執行到這裡只要一秒後"); } runB();

舉個mysql promise的實際例子,很多朋友會這樣寫

async function runC(CID, EID) { var customers = await db.query('SELECT * FROM Customer WHERE CID = ?', [CID]); var employees = await db.query('SELECT * FROM Employee WHERE EID = ?', [EID]); // .... } runC();

基本上這樣的操作會事先去資料庫查完 customer , 再去查 employee
但事實上兩個 query 完全不關聯,是可以同時執行的所
所以比較好的做法是

async function runD(CID, EID) { var customerP = db.query('SELECT * FROM Customer WHERE CID = ?', [CID]); var employeeP = db.query('SELECT * FROM Employee WHERE EID = ?', [EID]); var customers = await customerP; var employees = await employeeP; // .... } runD();

基本上我認為 async 、 await 只是 Promise 的語法糖,
並不是什麼太複雜的東西,如果還是會混淆建議先把 Proimse 搞懂