<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深入理解 JavaScript 異步系列(5)—— async await

      第一部分,ES7 中引入 async-await

      原文地址 http://www.rzrgm.cn/wangfupeng1988/p/6532734.html 未經作者允許,不得轉載~

      前面介紹完了Generator的異步處理,可以說是跌跌撞撞,經過各種基礎介紹和封裝,好容易出了一個比較簡潔的異步處理方案,學習成本非常高————這顯然不是我們想要的!

      因此,還未發布的 ES7 就干脆自己參照Generator封裝了一套異步處理方案————async-await。說是參照,其實可以理解為是Generator的語法糖!

      本節示例代碼參照這里

      本節內容概述

      • Generatorasync-await的對比
      • 使用async-await的不同和好處
      • 接下來...

      Generatorasync-await的對比

      先來一段Generator處理異步的代碼,前面已經介紹過了,看不明白的再獲取接著看。

      co(function* () {
          const r1 = yield readFilePromise('some1.json')
          console.log(r1)  // 打印第 1 個文件內容
          const r2 = yield readFilePromise('some2.json')
          console.log(r2)  // 打印第 2 個文件內容
      })

      再來一段async-await的執行代碼如下,兩者做一個比較。

      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,但是會直接同步執行,而不是異步。

      第二,執行const result = readFileAsync()返回的是個Promise對象,而且上面代碼中的return 'done'會直接被下面的then函數接收到

      result.then(data => {
          console.log(data)  // done
      })

      第三,從代碼的易讀性來將,async-await更加易讀簡介,也更加符合代碼的語意。而且還不用引用第三方庫,也無需學習Generator那一堆東西,使用成本非常低。

      因此,如果 ES7 正式發布了之后,強烈推薦使用async-await。但是現在尚未正式發布,從穩定性考慮,還是Generator更好一些。

      接下來...

      node v7 版本已經開始原生支持async-await了,不過 node 的目前穩定版本還是v6,尚不支持,怎么辦?———— 當然是萬能的babel!下一節就介紹。

       

      第二部分,如何在 nodejs 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就可以了

       

      第三部分,整體總結

      一周左右的業余時間總結完,寫完,也是累得我夠嗆。不算什么體力活,但是天天的坐在書桌旁寫這些東西也是很考驗一個人的定力,沒點耐性是肯定不行的 ———— 這算是獲獎感言嗎 ??

      本節內容概述

      • 基礎知識不可忽略
      • 異步操作代碼的變化
      • 寫在最后

      礎知識不可忽略

      這里的基礎知識分為兩部分,都不能忽略,都需要深入研究和思考

      • 什么是異步,異步的實現原理,event-loop,以及和事件綁定的關系。這些在最初介紹時,都講過,不要看完了就忘記了;
      • 無論異步操作的寫法如何變化,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源碼解讀

       

      posted @ 2017-03-14 08:42  王福朋  閱讀(36374)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 亚洲日韩国产成网在线观看| 亚洲欧美国产免费综合视频| 日韩av在线不卡一区二区| 天堂网亚洲综合在线| 日本无码欧美一区精品久久| 男女性高爱潮免费网站| 又大又粗欧美黑人aaaaa片| 亚洲自拍偷拍中文字幕色| 日韩av中文字幕有码| 中文字幕日韩精品亚洲一区| 国产很色很黄很大爽的视频| 亚洲人成网站在小说| 一区二区三区av天堂| 亚洲日韩中文字幕在线播放| 内射囯产旡码丰满少妇| 中文字幕亚洲精品第一页| 久久精品国产99国产精品澳门| 少妇又爽又刺激视频| 日韩高清国产中文字幕| 亚洲av成人区国产精品| 黑人巨茎大战白人美女| 国产蜜臀一区二区三区四区| 亚洲欧美日韩国产精品专区| 成人免费乱码大片a毛片| 免费看视频的网站| 又色又污又爽又黄的网站| 国产乱码精品一区二区三区中文| 日韩精品福利视频在线观看| 亚洲中文字幕国产综合| 国产精品普通话国语对白露脸 | 成人亚欧欧美激情在线观看| 国产无遮挡裸体免费久久| 伊人欧美在线| 免费国产va在线观看| 国产亚洲精品AA片在线播放天| 天堂在线www天堂中文在线 | 在线看高清中文字幕一区| 国产中文字幕在线精品| 日韩在线视频观看免费网站| 老妇女性较大毛片| 色视频在线观看免费视频 |