# async 、 await 在了解 async 、 await 之前你必須先了解原生 ES6 的 Promise,不了解的朋友可以先去了解一下。 雖然兩個常常一起用,但他是兩個完全可以拆開的應用。 所以接下來我會將他們兩個分開來講,最後在合併一起應用 ## async async,可以用來標註 function 讓 function 被一層 promise 包住 ```javascript= 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 ```javascript= async function a(){ var ans = await new Promise(function(resolve, reject) { resolve(1); }); console.log(ans); } a(); ``` ## async & await 由於async可以產生 Promise ,而 await 可以解開一層 Promise,所以我們可以將兩者混再一起用 ```javascript= async function a(){ return 1; } async function b(){ var ans = await a(); return ans; } b().then(function(r){ console.log(r); }); ``` # 注意 由於async 會等待 await 執行完才繼續執行,所以千萬要考慮效能問題 ```javascript= 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 ```javascript= async function runB() { var p1 = delay(1000); var p2 = delay(1000); await p1; await p2; console.log("執行到這裡只要一秒後"); } runB(); ``` 舉個mysql promise的實際例子,很多朋友會這樣寫 ```javascript= 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 完全不關聯,是可以同時執行的所 所以比較好的做法是 ```javascript= 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 搞懂