欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

異步編程之Generator(1)——領略魅力

系統(tǒng) 2326 0

異步編程系列教程:

  1. (翻譯)異步編程之Promise(1)——初見魅力
  2. 異步編程之Promise(2):探究原理
  3. 異步編程之Promise(3):拓展進階
  4. 異步編程之Generator(1)——領略魅力
  5. 異步編程之Generator(2)——剖析特性
  6. 異步編程之co——源碼分析

為何使用Generator


回顧一下我們之前學習的promise。我們巧妙利用了 promise/deferred 模式,用鏈式結構代替了嵌套回調(diào)的結構,大大緩解了回調(diào)地獄。我們再來看看之前我們舉的那個異步串行隊列的例子吧!假設我們有一個 hello.txt ,里面存了一個JSON文件的文件名,我們需要得到JSON文件的message屬性的值。步驟如下:

  1. 讀取 hello.txt 文件
  2. 得到JSON文件名,再次讀取文件
  3. 得到JSON數(shù)據(jù)后,進行JSON解析
  4. 獲得JSON的message屬性

Promise鏈式調(diào)用

這個例子我們之前也是舉過非常多次的,我們嘗試使用Promise鏈式結構完成:

    
      //這里的readFile已經(jīng)是promise化的異步API
readFile('hello.txt', 'utf-8')
    .then(function(filename){
        return readFile(filename, 'utf-8');
    })
    .then(JSON.parse)
    .then(function(data){
        console.log(data.message);
    })
    .catch(function(err){
        console.error(err.message);
    });
    
  

這樣一看下來,promise好像并沒有多大問題,思維是線性的,而且錯誤處理也很友好。我們只需要把上一層執(zhí)行后的結果通過 then() 傳到下一步執(zhí)行即可。嗯,但不得不說被鏈式結構束縛后,我們并沒有得到一種酣暢淋漓的編程體驗。

同步API

我們要寫的爽,當然是要將異步編程得到同步編程的體驗,這樣我們直接使用同步API看一下是怎樣的:

    
      var filename = fs.readFileSync('hello.txt', 'utf-8');
var json = fs.readFileSync(filename, 'utf-8');
console.log(JSON.parse(json).message);
    
  

同步的寫法清晰明了,而且更符合我們以往的編程習慣。但是同步API阻塞代碼這個弊病會在Javascript的單線程執(zhí)行中非常明顯。我們到底有沒有一種既可以非常接近同步編程的寫法,又可以異步不阻塞代碼執(zhí)行呢?既然問出這種問題,答案當然是有的,就是今天的主角: Generator

Generator使用co寫法

Generator,顧名思義是一個構造器,它本身是用來生成迭代器的。它是ES6的新東西,所以你為了使用它,需要在node中開啟harmony模式才能體驗到它。

$ node --harmony

基于Generator,TJ大神做了一個 co 庫。 co 在最新的版本里,結合Generator和Promise改善了異步編程的體驗,也就是我們之前說的: 既可以同步,又不會阻塞

還是一樣的例子,我們結合promise的代碼和同步API的代碼對比看看:

    
      co(function* (){
    var filename = yield readFile('hello.txt', 'utf-8');
    var json = yield readFile(filename, 'utf-8');
    return JSON.parse(json).message;
}).then(console.log, console.error);
    
  

非常像有沒有,我們不再需要將每一次異步的結果都放在 then() 中進行處理,我們可以通過類似于同步的寫法調(diào)用Promise異步API,大大提升編程體驗。最后 co() 返回了一個promise對象,提供我們做最后的數(shù)據(jù)處理和錯誤處理。我們從同步API轉到 co ,僅僅需要做到以下幾點:

  • co里面?zhèn)鞯暮瘮?shù)標識符需要加上*號, function* 。這也就是Generator函數(shù)
  • 調(diào)用promise異步API之前,都要加上 yield 標識符
  • 將需要做最后處理的數(shù)據(jù) return 出來,在 then() 中進行處理即可

預習Generator


我們在舉完異步串行的例子后,這次的文章就接近尾聲了。最后我們可以大致了解一下 co 到底是如何運作的呢?我們會在接下來的文章進行深究,這一次就簡單說一說,你當作預習就可以了:

Generator相關

  1. Generator生成迭代器后,等待迭代器的 next() 指令啟動。
  2. 啟動迭代器后,代碼會運行到y(tǒng)ield處停止。并返回一個 {value: AnyType, done: Boolean} 對象, value 是這次執(zhí)行的結果, done 是迭代是否結束。并等待下一次的 next() 指令。
  3. next() 再次啟動后。若 done 屬性不為true,則可以繼續(xù)從上一次停止的地方繼續(xù)迭代。
  4. 一直重復2,3步驟,直到 done 為true。

co相關

  1. co內(nèi)部的迭代器對象是被封裝成Promise的。
  2. yield 后面跟的必須是一個promise化的異步API,所以 next() 得到的結果是一個promise對象。
  3. 若迭代沒有結束,則 co 會自動為該異步promise對象的 resolve 中,增添一個 next() 。通過前面的異步執(zhí)行完回調(diào)后,再調(diào)用 next() ,使迭代器的代碼不斷向前執(zhí)行。
  4. 若迭代結束,則直接調(diào)用整個迭代器對象的 resolve

總結

或許現(xiàn)在大家看的是一知半解,或許很興奮想知道更多相關的。若僅僅是想學會用co,我想上面的大概已經(jīng)足夠你看了。但是想更深入,你必須先弄懂promise的原理和Generator的相關特性。最后使用 co 庫一定會得心應手。

接下來,我會先講一些關于Generator的相關特性,再配合之前說過的promise,深入到 co 的源碼學習中。

異步編程之Generator(1)——領略魅力


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 伦理午夜电影免费观看 | 久色亚洲 | 一区二区三区视频免费观看 | 亚洲福利 | 亚洲精品国产电影 | 特级毛片免费观看视频 | 日韩一区二区在线视频 | 91在线播放免费不卡无毒 | 亚洲欧美无人区乱码 | 久久久久国产成人精品亚洲午夜 | 国产成人福利 | 色爱综合网| 天天干天天草 | 国产精品精品视频一区二区三区 | 成人av免费在线观看 | 国产精品一二区 | 一级毛片免费电影 | 国产在线一区二区 | 成人免费网站www网站高清 | 午夜电影剧场 | 婷婷成人免费视频 | 福利入口在线观看 | 亚洲国产精品久久综合 | 亚洲一区二区久久 | 久久国产精品99久久久久久牛牛 | 欧美一级艳片视频免费观看 | 日本天堂一区 | 亚洲一区在线播放 | 欧美金妇欧美乱妇视频 | 免费视频99 | 一区二区三区国产在线 | 亚洲电影免费观看高清完整版在线观 | 亚洲精品亚洲人成人网 | 一区在线免费观看 | 成人爽a毛片在线视频网站 婷婷色在线观看 | 亚洲综合久久伊人热 | 国产精品一区在线观看你懂的 | 人人看人人干 | 一区二区视频在线观看 | 日韩在线免费电影 | 久久性|