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

您的位置:首頁技術(shù)文章
文章詳情頁

JS co 函數(shù)庫的含義和用法實(shí)例總結(jié)

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

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

繼續(xù)學(xué)習(xí)阮一峰老師異步編程四部曲之三:co

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

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

現(xiàn)在終于一切回歸正常了,還在拼命的適應(yīng)新公司的節(jié)奏。只能趁周末繼續(xù)學(xué)習(xí)了。

好了,不瞎扯了,回歸主題,前兩篇文章我們分別學(xué)習(xí)了 Generator 函數(shù)和 Thunk 方式的自動執(zhí)行。

今天我們接著上次的思路學(xué)習(xí)使用 co 工具實(shí)現(xiàn) Generator 函數(shù)的自動執(zhí)行。

再次拿出上一節(jié)的示例:

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());};

這段代碼用于讀取兩個(gè)文件,怎么使用 co 工具來實(shí)現(xiàn)自動執(zhí)行呢?

很簡單:

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

上面代碼中,只要把 Generator 函數(shù)傳入 co 函數(shù),就會自動執(zhí)行。

co 函數(shù)返回一個(gè) Promise 對象,因此可以用 then 方法添加回調(diào)函數(shù),當(dāng) Generator 執(zhí)行結(jié)束就會觸發(fā)回調(diào):

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

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

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

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

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

實(shí)現(xiàn)原理:

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

今天我們研究 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());};

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

在我們?nèi)粘i_發(fā)的過程中,也可以參考這種方式。當(dāng)邏輯復(fù)雜時(shí),不妨先用最直白的方式把它實(shí)現(xiàn),

然后再去發(fā)現(xiàn)里面的規(guī)則,去優(yōu)化重構(gòu)。又開始扯了,看一下手動執(zhí)行的代碼:

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

手動執(zhí)行其實(shí)就是用 then 方法,層層添加回調(diào)函數(shù)。理解了這一點(diǎn),就可以寫出一個(gè)自動執(zhí)行器:

function run(gen){ var g = gen(); //開始執(zhí)行 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函數(shù)的區(qū)別是,Thunk 函數(shù)在執(zhí)行成功后把 next 傳給 thunkify ,讓 thunkify 來幫忙執(zhí)行 next

這里的做法是吧 next 交給 Promise,promise 控制請求成功時(shí)執(zhí)行 next。區(qū)別只有這么一點(diǎn)。

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

co 函數(shù)接受一個(gè) Generator 參數(shù),返回一個(gè) Promise 對象

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

在返回的 Promise 對象里面,先檢查參數(shù) gen 是否為 Generator 函數(shù)。如果是,就執(zhí)行該函數(shù),得到一個(gè)內(nèi)部指針對象;

如果不是就返回,并將 Promise 對象的狀態(tài)改為 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 方法進(jìn)行包裝,使異常能夠暴露出來:

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對象,當(dāng)promist處理成功時(shí)再次執(zhí)行onFulfilled

以此來達(dá)到自動執(zhí)行的效果。

co 還支持并發(fā)的異步操作,yield 返回一個(gè)數(shù)組或者是支持遍歷的對象即可:

// 數(shù)組的寫法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 的自動執(zhí)行原理我們已經(jīng)學(xué)習(xí)完成了,

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

對我的小容量大腦來說,現(xiàn)在的認(rèn)識還只到90%

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

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

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

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
影院欧美亚洲| 妖精视频成人观看www| 国产综合欧美| 日韩一区二区三区免费播放| 97久久超碰| 亚洲精品乱码| 国产aⅴ精品一区二区四区| 国产成人精品999在线观看| 日韩中文欧美在线| 日本高清不卡一区二区三区视频| 欧美日韩99| 亚久久调教视频| 99亚洲视频| 亚洲在线观看| 欧美精品黄色| 欧美亚洲福利| 色婷婷成人网| 日本一不卡视频| 日韩国产在线观看一区| 亚洲精品美女91| 国产精品美女久久久浪潮软件| 久久天堂影院| 亚洲欧美日韩专区| 国产精品二区不卡| 精品一区二区三区中文字幕视频 | 久久电影一区| 中文精品在线| 亚洲国产成人精品女人| 91一区二区| 欧美亚洲色图校园春色| 免费成人在线观看| 樱桃成人精品视频在线播放| 日韩欧美二区| 激情自拍一区| 久久午夜精品| 日本中文字幕一区二区| 欧美aa在线视频| 精品一区毛片| 国产模特精品视频久久久久| 性欧美xxxx免费岛国不卡电影| 日韩精品三级| 亚洲一区二区小说| 亚洲精品人人| 蜜桃av一区二区| 日韩精品导航| 老司机精品在线| 国产va在线视频| 午夜久久免费观看| 日韩一区网站| 国产一区二区三区四区二区| 久久精品国语| 中文不卡在线| 免费一级欧美在线观看视频| 久久这里只有| 亚洲作爱视频| 成人在线视频区| 日韩一区精品视频| 精品国产亚洲日本| 国产精品国产一区| 成人台湾亚洲精品一区二区 | 国产日韩精品视频一区二区三区| 欧美影院精品| 精精国产xxxx视频在线野外| 午夜一区在线| 精品在线网站观看| 亚洲欧美成人综合| 久久精品二区亚洲w码| 不卡在线一区| 精品久久久中文字幕| 亚洲中午字幕| 国产精品免费不| 午夜国产精品视频| 日韩和欧美一区二区| 九九久久电影| 激情视频网站在线播放色| 欧美精品不卡| 亚洲2区在线| 久久久蜜桃一区二区人| 麻豆久久久久久| 欧美va天堂在线| 国产精品一区毛片| 亚欧洲精品视频在线观看| 福利一区二区三区视频在线观看| 国产亚洲在线观看| 久久精品国内一区二区三区水蜜桃| 狠狠久久伊人| 国产精品99精品一区二区三区∴ | 欧美日韩视频免费看| 国产一区亚洲| 国产66精品| 欧美激情综合| 国产精品一区二区三区www| 亚洲日韩视频| 日韩国产在线一| 一区二区三区四区日韩| 日本亚洲欧洲无免费码在线| 亚洲一本视频| 蜜桃视频第一区免费观看| 不卡av一区二区| 麻豆91小视频| 日韩av一区二区三区| 欧美一区精品| 91久久亚洲| 欧美一区91| 精品国产乱码| 欧美日韩视频网站| 久久久精品国产**网站| 国产精品videossex| 欧美视频久久| 美女久久久精品| 精品视频一区二区三区在线观看 | 成人亚洲一区| 免费一二一二在线视频| 亚洲成人不卡| 中国女人久久久| 国产精品v一区二区三区| 国产 日韩 欧美 综合 一区| 一区在线视频观看| 日韩视频二区| 国产精品久久久久久久久久齐齐 | 亚洲欧美日韩一区在线观看| 精品1区2区3区4区| 欧美精品一区二区久久| 麻豆精品蜜桃| 亚洲精品三级| 亚洲电影有码| 麻豆成人综合网| 国产精品人人爽人人做我的可爱| 欧美日一区二区在线观看| 日韩电影免费网站| 欧美三区不卡| 亚洲欧美日韩专区| 日韩精品中文字幕吗一区二区| 日本成人在线一区| 国产欧洲在线| 石原莉奈一区二区三区在线观看| 免费日韩av片| 蜜桃成人精品| 免费在线视频一区| 日韩在线视频精品| 激情亚洲影院在线观看| 精品伊人久久| 日韩免费福利视频| 亚洲综合二区| 国产亚洲精品美女久久| 亚洲欧美高清| 国产一区调教| 精品欧美视频| 久久网站免费观看| 免费久久精品| 三级久久三级久久久| 久久国产精品99国产| 91精品啪在线观看国产爱臀| 日本少妇一区| 国产精品色在线网站| 亚州av乱码久久精品蜜桃| 91成人在线网站| 91一区二区| 欧美在线亚洲| 麻豆mv在线观看| 国产日产一区| 国内激情久久| 亚洲专区一区| 狠狠久久婷婷| 免费在线观看精品| 中文字幕视频精品一区二区三区| 天使萌一区二区三区免费观看| 国产精品久久久久久久久久齐齐 | 精品国产乱码久久久| 国产99亚洲| 久久蜜桃av| 久久香蕉精品| 亚洲www免费| 久久精品国产在热久久| 国产视频网站一区二区三区| 石原莉奈在线亚洲二区| 午夜国产一区二区| 成人黄色av| 国产日韩免费| 精品欧美久久| 五月婷婷六月综合| 国产一区二区三区久久久久久久久| 久久久久网站| 国产日本精品| 日韩精彩视频在线观看| 香蕉久久夜色精品国产| 91亚洲一区| 四虎884aa成人精品最新| 91亚洲成人| 国产一区 二区| 国产黄色精品| 日韩精品一二三区| 免费成人在线影院| 日韩中文av| 欧美精品不卡| 久久国产精品色av免费看| 亚洲天堂1区| 国产精品久久久久久久久久齐齐 | 激情久久一区二区| 久久国产高清|