原文地址 http://www.cnblogs.com/wangfupeng1988/p/6532734.html 未經做者容許,不得轉載~html
前面介紹完了Generator
的異步處理,能夠說是跌跌撞撞,通過各類基礎介紹和封裝,好容易出了一個比較簡潔的異步處理方案,學習成本很是高————這顯然不是咱們想要的!前端
所以,還未發佈的 ES7 就乾脆本身參照Generator
封裝了一套異步處理方案————async-await
。說是參照,其實能夠理解爲是Generator
的語法糖!node
本節示例代碼參照這裏git
Generator
和async-await
的對比async-await
的不一樣和好處Generator
和async-await
的對比先來一段Generator
處理異步的代碼,前面已經介紹過了,看不明白的再獲取接着看。github
co(function* () { const r1 = yield readFilePromise('some1.json') console.log(r1) // 打印第 1 個文件內容 const r2 = yield readFilePromise('some2.json') console.log(r2) // 打印第 2 個文件內容 })
再來一段async-await
的執行代碼以下,二者作一個比較。web
const readFilePromise = Q.denodeify(fs.readFile) // 定義 async 函數 const readFileAsync = async function () { const f1 = await readFilePromise('data1.json') const f2 = await readFilePromise('data2.json') console.log('data1.json', f1.toString()) console.log('data2.json', f2.toString()) return 'done' // 先忽略,後面會講到 } // 執行 const result = readFileAsync()
從上面兩端代碼比較看來,async function
代替了function*
,await
代替了yield
,其餘的再沒有什麼區別了。哦,還有,使用async-await
時候不用再引用co
這種第三方庫了,直接執行便可。面試
async-await
的不一樣和好處第一,await
後面不能再跟thunk
函數,而必須跟一個Promise
對象(所以,Promise
纔是異步的終極解決方案和將來)。跟其餘類型的數據也OK,可是會直接同步執行,而不是異步。npm
第二,執行const result = readFileAsync()
返回的是個Promise
對象,並且上面代碼中的return 'done'
會直接被下面的then
函數接收到json
result.then(data => { console.log(data) // done })
第三,從代碼的易讀性來將,async-await
更加易讀簡介,也更加符合代碼的語意。並且還不用引用第三方庫,也無需學習Generator
那一堆東西,使用成本很是低。babel
所以,若是 ES7 正式發佈了以後,強烈推薦使用async-await
。可是如今還沒有正式發佈,從穩定性考慮,仍是Generator
更好一些。
node v7
版本已經開始原生支持async-await
了,不過 node 的目前穩定版本仍是v6
,尚不支持,怎麼辦?———— 固然是萬能的babel
!下一節就介紹。
v6.x
版本中使用 async-await本節介紹一下如何使用babel
來讓 node v6
版本也能運行async-await
運行npm i babel-core babel-plugin-transform-runtime babel-preset-es2015 babel-preset-stage-3 babel-runtime --save
安裝一堆須要的插件。
而後在項目根目錄建立.babelrc
文件,文件內容編寫爲
{ "presets": ["stage-3", "es2015"], "plugins": ["transform-runtime"] }
加入你編寫async-await
的代碼文件是test.js
,那麼你須要建立另外一個文件,例如test-entry.js
做爲入口文件。入口文件內容編寫爲
require("babel-core/register");
require("./test.js");
而後直接運行node test-entry.js
就能夠了
一週左右的業餘時間總結完,寫完,也是累得我夠嗆。不算什麼體力活,可是每天的坐在書桌旁寫這些東西也是很考驗一我的的定力,沒點耐性是確定不行的 ———— 這算是獲獎感言嗎 😂
這裏的基礎知識分爲兩部分,都不能忽略,都須要深刻研究和思考
callback
一直都存在並且發揮做用,這個在此前的章節一直強調;最後咱們來感覺一下,從一開始callback
方式到後來的async-await
方式,前先後後編寫異步代碼的變化。從變化中就能夠體會到,確實愈來愈簡潔,愈來愈易讀。
callback
方式
fs.readFile('some1.json', (err, data) => { fs.readFile('some2.json', (err, data) => { fs.readFile('some3.json', (err, data) => { fs.readFile('some4.json', (err, data) => { }) }) }) })
Promise
方式
readFilePromise('some1.json').then(data => { return readFilePromise('some2.json') }).then(data => { return readFilePromise('some3.json') }).then(data => { return readFilePromise('some4.json') })
Generator
方式
co(function* () { const r1 = yield readFilePromise('some1.json') const r2 = yield readFilePromise('some2.json') const r3 = yield readFilePromise('some3.json') const r4 = yield readFilePromise('some4.json') })
async-await
方式
const readFileAsync = async function () { const f1 = await readFilePromise('data1.json') const f2 = await readFilePromise('data2.json') const f3 = await readFilePromise('data3.json') const f4 = await readFilePromise('data4.json') }
寫到這裏,也沒啥可寫的了,這裏但願你們多多按照本身的思路來思考問題吧。最後,歡迎掃碼轉帳給我打賞,哈哈!
若是你看完了,感受還不錯,歡迎給我打賞 ———— 以激勵我更多輸出優質內容
最後,github地址是 https://github.com/wangfupeng1988/js-async-tutorial 歡迎 star 和 pr
------
學習做者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大衆點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀》