日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JS co 函數庫的含義和用法實例總結

瀏覽:210日期:2024-05-13 14:56:15

本文實例講述了JS co 函數庫的含義和用法。分享給大家供大家參考,具體如下:

繼續學習阮一峰老師異步編程四部曲之三:co

co在很早之前就聽超哥講過,說在node編程中大量用到,源碼很簡單,但是想法很強大。

讓我有空抓緊了解下,前一段時間弄離職的事情,跑來跑去累的夠嗆。

現在終于一切回歸正常了,還在拼命的適應新公司的節奏。只能趁周末繼續學習了。

好了,不瞎扯了,回歸主題,前兩篇文章我們分別學習了 Generator 函數和 Thunk 方式的自動執行。

今天我們接著上次的思路學習使用 co 工具實現 Generator 函數的自動執行。

再次拿出上一節的示例:

var fs = require(’fs’);var thunkify = require(’thunkify’);var readFile = thunkify(fs.readFile); var gen = function* (){ var r1 = yield readFile(’/etc/fstab’); console.log(r1.toString()); var r2 = yield readFile(’/etc/shells’); console.log(r2.toString());};

這段代碼用于讀取兩個文件,怎么使用 co 工具來實現自動執行呢?

很簡單:

var co = require(’co’);co(gen);

上面代碼中,只要把 Generator 函數傳入 co 函數,就會自動執行。

co 函數返回一個 Promise 對象,因此可以用 then 方法添加回調函數,當 Generator 執行結束就會觸發回調:

co(gen).then(function (){ //success});

這么看起來的話好像和我們之前的 Thunk 方式差不多啊,只是把 run 函數名改成了 co

唯一的區別是多了一層 Promise 包裝,那么 co 和 Thunk 到底有什么區別呢?

正如我們的猜測一樣,co 其實是將之前的兩種自動執行方式(Thunk 和 Promise)結合到了一起,包裝成一個庫。

使用它的前提和比Thunk多了一種 Promise 的情況,也就是yield返回值必須是 Thunk 函數和 Promise 對象之一

實現原理:

之前我們在研究 Thunk 函數時的第一步是使用 thunkify 將 readFile 包裝成 Thunk 函數:

今天我們研究 Promise 就需要把 readFile 包裝成 Promise 對象,看代碼:

var fs = require(’fs’); var readFile = function (fileName){ return new Promise(function (resolve, reject){ fs.readFile(fileName, function(error, data){ if (error) reject(error); resolve(data); }); });}; var gen = function* (){ var f1 = yield readFile(’/etc/fstab’); var f2 = yield readFile(’/etc/shells’); console.log(f1.toString()); console.log(f2.toString());};

接下來是我特別喜歡老師做的一件事,先用最原始的方式,手動執行一遍代碼。

在我們日常開發的過程中,也可以參考這種方式。當邏輯復雜時,不妨先用最直白的方式把它實現,

然后再去發現里面的規則,去優化重構。又開始扯了,看一下手動執行的代碼:

var g = gen(); g.next().value.then(function(data){ g.next(data).value.then(function(data){ g.next(data); });});

手動執行其實就是用 then 方法,層層添加回調函數。理解了這一點,就可以寫出一個自動執行器:

function run(gen){ var g = gen(); //開始執行 function next(data){ var result = g.next(data); if (result.done) return result.value; result.value.then(function(data){ next(data); }); } next();}run(gen);

和Thunk函數的區別是,Thunk 函數在執行成功后把 next 傳給 thunkify ,讓 thunkify 來幫忙執行 next

這里的做法是吧 next 交給 Promise,promise 控制請求成功時執行 next。區別只有這么一點。

分析了原理之后,我們來分析下co的源碼:

co 函數接受一個 Generator 參數,返回一個 Promise 對象

function co(gen) { var ctx = this; return new Promise(function(resolve, reject) { });}

在返回的 Promise 對象里面,先檢查參數 gen 是否為 Generator 函數。如果是,就執行該函數,得到一個內部指針對象;

如果不是就返回,并將 Promise 對象的狀態改為 resolved 。

function co(gen) { var ctx = this; return new Promise(function(resolve, reject) { if (typeof gen === ’function’) gen = gen.call(ctx); if (!gen || typeof gen.next !== ’function’) return resolve(gen); });}

接著,co 對 next 方法進行包裝,使異常能夠暴露出來:

function co(gen) { var ctx = this; return new Promise(function(resolve, reject) { if (typeof gen === ’function’) gen = gen.call(ctx); if (!gen || typeof gen.next !== ’function’) return resolve(gen); onFulfilled(); function onFulfilled(res) { var ret; try { ret = gen.next(res); } catch (e) { return reject(e); } next(ret); } });}

最后就是next方法了:

function next(ret) { if (ret.done) return resolve(ret.value); var value = toPromise.call(ctx, ret.value); if (value && isPromise(value)) return value.then(onFulfilled, onRejected); return onRejected(new TypeError(’You may only yield a function, promise, generator, array, or object, ’ + ’but the following object was passed: '’ + String(ret.value) + ’'’)); }});

next方法最主要的一行:

if (value && isPromise(value)) return value.then(onFulfilled, onRejected);

co的使用條件,每一次yield返回必須是Promise對象,當promist處理成功時再次執行onFulfilled

以此來達到自動執行的效果。

co 還支持并發的異步操作,yield 返回一個數組或者是支持遍歷的對象即可:

// 數組的寫法co(function* () { var res = yield [ Promise.resolve(1), Promise.resolve(2) ]; console.log(res); }).catch(onerror); // 對象的寫法co(function* () { var res = yield { 1: Promise.resolve(1), 2: Promise.resolve(2), }; console.log(res); }).catch(onerror);

至此,co 的自動執行原理我們已經學習完成了,

其實本質上不是很難,只是涉及到的模塊較多,思路比較靈活

對我的小容量大腦來說,現在的認識還只到90%

所以這篇文章里面自己的思想比較少,更多的還是在復述老師的思路。

最后貼上原文的地址:co 函數庫的含義和用法

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
夜鲁夜鲁夜鲁视频在线播放| 国产欧美欧美| 国产夫妻在线| 久久91视频| 国产一区丝袜| 欧产日产国产精品视频| 99免费精品| 欧美在线亚洲| 免费美女久久99| 婷婷综合国产| 亚洲一二av| 日韩精品成人在线观看| 国产亚洲第一伦理第一区| 久久国内精品自在自线400部| 国产精品对白久久久久粗| 国产在线不卡一区二区三区| 在线手机中文字幕| 欧美亚洲在线日韩| 中文日韩在线| 亚洲精品免费观看| 国产精品22p| 一本大道色婷婷在线| 国产在线成人| 日韩精品一二三| 欧美日韩一区自拍| 麻豆精品99| 91精品一区二区三区综合| 美女国产精品| 国产精品chinese| 国产精品久久观看| 午夜日韩福利| 欧美日一区二区三区在线观看国产免| 久久婷婷国产| 亚洲韩日在线| 日本91福利区| av最新在线| 国产农村妇女精品一二区| 91精品国产一区二区在线观看| 美女性感视频久久| 91超碰国产精品| 天堂va欧美ⅴa亚洲va一国产| 国产精品2023| 精品欧美久久| 日韩精品高清不卡| 日韩黄色大片| 亚洲色图国产| av在线资源| 狠狠久久婷婷| 国产精品亚洲产品| 好看的亚洲午夜视频在线| 69堂精品视频在线播放| 久久久久国产| 日韩欧乱色一区二区三区在线| 精品视频自拍| 国产亚洲福利| 国产激情综合| 国产精品社区| 国产成人久久| 亚洲精品影院在线观看| 国产91在线精品| 亚洲精品一级二级三级| 波多视频一区| 欧美日韩99| 欧美午夜不卡| 国产videos久久| 亚洲一级淫片| 91精品国产自产在线观看永久∴ | 91午夜精品| 欧美日韩激情| 国产精品亚洲产品| 视频在线在亚洲| 日韩不卡免费高清视频| 国产色噜噜噜91在线精品| 99国产精品99久久久久久粉嫩| 黄色网一区二区| 日韩高清不卡一区| 国产日韩综合| 午夜av成人| 国产激情综合| 亚洲精品动态| 9久re热视频在线精品| 久久影院午夜精品| 国产伦精品一区二区三区视频| 亚洲一区二区成人| 岛国av在线网站| 国产精品一区二区三区av | 久久免费高清| 精品国产一区二区三区av片| 天堂va在线高清一区| 国产视频一区欧美| 久久精品国产99久久| 国产精品久久久久久久久久白浆 | 国产毛片精品久久| 最近国产精品视频| 999在线观看精品免费不卡网站| 国产精品22p| 日韩av一区二区三区四区| 狠狠干成人综合网| 婷婷六月综合| 电影亚洲精品噜噜在线观看| 另类综合日韩欧美亚洲| 欧美色综合网| 欧美亚洲综合视频| 美国三级日本三级久久99| 不卡中文一二三区| 免费视频亚洲| 九九久久电影| 欧美va天堂在线| 亚洲午夜精品久久久久久app| 福利精品在线| 国产极品久久久久久久久波多结野 | 精品久久久亚洲| 国产精品成人国产| 久久国产乱子精品免费女| 亚洲一二av| 香蕉久久一区| 婷婷精品在线| 91成人在线精品视频| 欧美精品中文| 麻豆久久久久久| 久久av网站| 国产精品高清一区二区| 国产美女久久| 老司机精品视频在线播放| 另类欧美日韩国产在线| 久久精品免视看国产成人| 精品美女视频 | 91精品国产调教在线观看| 久久精品国产68国产精品亚洲| 亚洲精品一区三区三区在线观看| 久久久人人人| 欧美日韩国产免费观看视频| 99成人在线视频| 亚洲女同中文字幕| 免费日韩精品中文字幕视频在线| 日韩专区欧美专区| 日韩高清不卡一区| 麻豆高清免费国产一区| 欧美激情另类| 免费av一区| 日韩精品一级二级| 日本一区二区中文字幕| 国产欧美三级| 九九九精品视频| 99久久精品费精品国产| 国产精品视区| 久久狠狠久久| 精品久久久久中文字幕小说| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产日韩欧美三区| 精品三级久久久| 久久久久91| 蜜臀久久久久久久| 青青伊人久久| 成人国产精品久久| 国产在线欧美| 91在线成人| 日韩免费小视频| 亚洲欧美日韩在线观看a三区| 国产欧美一区二区三区米奇| 欧美国产极品| 美女久久久久| 日本成人中文字幕| 加勒比视频一区| 91久久在线| 国产亚洲人成a在线v网站| 日韩精品第一区| 亚洲视频二区| 久久99国产精品视频| 一区二区亚洲精品| 国产精品网站在线看| 久久蜜桃精品| 日韩高清在线不卡| 精品捆绑调教一区二区三区| 在线观看一区| sm捆绑调教国产免费网站在线观看 | 综合激情视频| 精品国产一区二| 国产精品毛片在线| 久久69成人| 亚洲神马久久| 精品国产亚洲一区二区三区| 国产精品88久久久久久| 国产欧美日韩精品一区二区三区| 久久免费黄色| 欧美亚洲网站| 久久精品播放| 国产探花一区| 日韩午夜精品| 国产精品99一区二区三区| 亚洲综合不卡| 成人在线视频中文字幕| 蜜臀va亚洲va欧美va天堂| 成人在线观看免费视频| 亚洲久久视频| 天堂√8在线中文| 欧美一区=区三区| 狠狠色狠狠色综合日日tαg| 久久字幕精品一区| 亚洲区国产区|