### 異步操作與async函數
* 異步與回調
* Promise
* Generator
* Thunk
* async
* * * * *
#### 異步與回調
> 注:“本文檔主要在于講解異步操作的終極方案 async ,其他的方法和案例都只為理解async做鋪墊”
> 所謂的“異步”,就是把一個任務分為兩段去執行,先執行第一段,然后轉而執行其他任務,等第一段任務執行好之后再回頭執行第二段,之后再去執行其他任務。舉個例子:
> 小明每天下班回家,先點外賣,再打開洗衣機洗衣服,然后外賣到了先吃飯,吃完飯去晾衣服。
> 上面的例子就是一個異步,如果將上面的異步轉為同步,流程如下:
> 小明每天下班回家,先點外賣,等待外賣到了之后吃飯,然后打開洗衣機洗衣服,然后等洗衣機洗好衣服后晾衣服。
> 上面兩種例子闡述了異步與同步的概念,異步就是執行沒個任務都不需要等待滿足某個特定條件,而同步,則需要在某個事情完整的執行完成后才能執行下一個事情
> 所謂“回調函數”,又是何物?回調函數就是把異步任務的第二段,單獨寫入一個函數,等到重新執行該任務時直接調用這個函數。
#### Promise
> 回調函數本身沒有問題,只是在使用過程中由于業務邏輯變的復雜,回調函數通常都是很多個嵌套在一起,亂成一團,很難管理,這種情況稱為“回調地獄”(callback hell),如:
~~~
fs.readfile(a,function(err,data){
fs.readfile(b,function(err,data){
.....
})
})
~~~
> Promise就是為了解決這種問題而生,它不是一種新語法,只是一種新寫法,能將橫向價值的回調函數改寫為縱向加載,如:
~~~
fs.readfile(file)
.then(function(data){
console.log(data);
})
.then(function(data){
console.log(data);
})
.catch(function(err){
console.log(err);
});
~~~
> Promise提供了then方法加載回調函數,catch方法捕捉執行過程中拋出的錯誤,在使用Promise后,每段任務看的更清楚了,而最大的問題就是隨著業務邏輯的增加代碼變的臃腫了,一眼看去全是then,那么有沒有其他方法呢?
#### Generator
> Generator是ES6中實現的一個協程,最大的特點就是可以暫停函數執行