# 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 搞懂