# Async函數/Await(以前說是ES7 stage-3)
Generator的弊病是沒有執行器,它本身就不是為流程控制而生的,所以co的出現只是解決了這個問題。
可是,你不覺得奇怪么?為什么非要加個co,才能好好的玩耍?為什么不能是直接就可以執行,并且效果和Yieldable一樣的呢?
Async/Await 就是這樣被搞出來的,很多人認為它是異步操作的終極解決方案。
**Await**
Await的3種可能情況
* Await + Async函數
* Await + Promise
* await + co(co會返回Promise,這樣可以Yieldable,但難度較大,適合老手)
頭2種是比較常用的,第三種co作為promise生成器,是一種hack的辦法。
下面給出第一種和第二種的示例:
~~~
async function a2() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 1000);
})
}
async function a1() {
console.log("hello a1 and start a2");
await a2();
console.log("hello end a2");
}
async function a0() {
console.log("hello a0 and start a1");
await a1();
console.log("hello end a1");
}
a0()
~~~
**執行**
需要使用babel或者其他支持async函數的編譯工具,這里使用runkoa(是為koa支持async函數做的基于babel的簡單封裝)
~~~
$ runkoa async.js
async.js
3babel presets path = /Users/sang/.nvm/versions/node/v4.4.5/lib/node_modules/runkoa/node_modules/
hello a0 and start a1
hello a1 and start a2
hello end a2
hello end a1
~~~
**異常處理**
Node.js里關于異常處理有一個約定,即同步代碼采用try/catch,非同步代碼采用error-first方式。對于Async函數倆說,它的Await語句是同步執行的,所以最正常的流程處理是采用try/catch語句捕獲,和generator/yield是一樣的。
下面的代碼所展示的是通用性的做法:
~~~
try {
console.log(await asyncFn());
} catch (err) {
console.error(err);
}
~~~
很多時候,我們需要把異常做得粒度更細致一些,這時只要把Promise的異常處理好就好了。
Promise里有2種處理異常的方法
* then(onFulfilled, onRejected)里的onRejected,處理當前Promise里的異常
* catch處理全局異常
**Async函數總結**
* Async函數語義上非常好
* Async不需要執行器,它本身具備執行能力,不像Generator
* Async函數的異常處理采用try/catch和Promise的錯誤處理,非常強大
* Await接Promise,Promise自身就足夠應對所有流程了
* Await釋放Promise的組合能力,外加Promise的then,基本無敵
- 前言
- 1 skill
- 1.1 Coding WebIDE
- 1.2 git
- 1.3 extra practice
- 1.4 預習
- 2 nodejs入門
- 2.1 入門
- 2.2 安裝
- 2.3 helloworld
- 2.4 commonJS規范
- 2.5 模塊導出
- 2.6 Nodejs代碼調試
- 2.7 編寫Nodejs模塊
- 2.8 最小化問題
- 2.9 隨堂練習
- 3 異步流程控制
- 3.1 什么時候會用到異步流程控制
- 3.2 簡單做法async模塊
- 3.3 Promise/a+規范
- 3.4 Node.js Promise/a+實現
- 3.5 生成器Generators/yield
- 3.6 Async函數/Await
- 3.7 神奇的co
- 3.8 5種 yieldable
- 3.9 學習重點
- 3.10 隨堂練習
- 4 express和微信開發入門
- 4.1 入門
- 4.2 connect
- 4.3 靜態Http服務器
- 4.4 那些預處理器
- 4.5 路由
- 4.6 視圖與模塊引擎
- 4.7 中間件
- 4.8 更多實踐
- 4.9 微信入門
- 4.10 隨堂練習:完成登錄、注冊功能
- 5 微信實例與H5實踐
- 5.1 微信基礎和sandbox
- 5.2 公眾號菜單和自動回復
- 5.3 微信OAuth用戶授權
- 5.4 微信分享
- 5.5 wechat-api
- 5.6 H5-上篇
- 5.7 H5-下篇
- 5.8 隨堂練習
- 6 weui實戰
- 6.1 使用bower
- 6.2 移動端抽象
- 6.3 優化滑動列表
- 6.4 weui
- 6.5 讓weui和iscroll結婚
- 6.6 優化事件
- 6.7 how-to-write-h5
- 6.8 優化無止境
- 6.9 隨堂練習
- 7 微信支付
- 7.1 吹個牛
- 7.2 支付概述
- 7.3 科普幾個概念
- 7.4 準備
- 7.5 調試
- 7.6 公眾號支付(JSAPI)
- 7.7 對賬單
- 7.8 數據處理
- 7.9 隨堂練習
- 8 項目實戰《付費課程系統MVP》
- 8.1 需求分析
- 8.2 ui/ue
- 8.3 技術棧
- 8.4 模型
- 8.5 靜態api
- 8.6 開發
- 8.7 部署
- 8.8 監控
- 8.9 數據統計
- 8.10 demo
- 9 高級篇
- 9.1 前后端分離實踐?
- 9.2 如何展望未來的大前端
- 9.3 容器和微服務
- 10 答疑問題收集