电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:112日期: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
相關文章:
主站蜘蛛池模板: lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 酒店品牌设计-酒店vi设计-酒店标识设计【国际级】VI策划公司 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | OLChemim试剂-ABsciex耗材-广州市自力色谱科仪有限公司 | 苹果售后维修点查询,苹果iPhone授权售后维修服务中心 – 修果网 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 电子巡更系统-巡检管理系统-智能巡检【金万码】 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 网站制作优化_网站SEO推广解决方案-无锡首宸信息科技公司 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 365文案网_全网创意文案句子素材站| 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 中医中药治疗血小板减少-石家庄血液病肿瘤门诊部 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 数显恒温油浴-电砂浴-高温油浴振荡器-常州迈科诺仪器有限公司 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 消防设施操作员考试报名时间,报名入口,报考条件 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 |