国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

傻瓜式解讀koa中間件處理模塊koa-compose的使用

2024-05-06 15:28:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近需要單獨(dú)使用到koa-compose這個(gè)模塊,雖然使用koa的時(shí)候大致知道中間件的執(zhí)行流程,但是沒(méi)仔細(xì)研究過(guò)源碼用起來(lái)還是不放心(主要是這個(gè)模塊代碼少,多的話也沒(méi)興趣去研究了)。

koa-compose看起來(lái)代碼少,但是確實(shí)繞。閉包,遞歸,Promise。。。看了一遍腦子里繞不清楚??戳司W(wǎng)上幾篇解讀文章,都是針對(duì)單行代碼做解釋,還是繞不清楚。最后只好采取一種傻瓜的方式:

koa-compose去掉一些注釋,類型校驗(yàn)后,源碼如下:

function compose (middleware) { return function (context, next) {  // last called middleware #  let index = -1  return dispatch(0)  function dispatch (i) {   if (i <= index) return Promise.reject(new Error('next() called multiple times'))   index = i   let fn = middleware[i]   if (i === middleware.length) fn = next   if (!fn) return Promise.resolve()   try {    return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));   } catch (err) {    return Promise.reject(err)   }  } }}

寫(xiě)出如下代碼:

var index = -1;function compose() {  return dispatch(0)}function dispatch (i) {   if (i <= index) return Promise.reject(new Error('next() called multiple times'))   index = i   var fn = middleware[i]   if (i === middleware.length) fn = next   if (!fn) return Promise.resolve('fn is undefined')   try {    return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));   } catch (err) {    return Promise.reject(err)   } }  function f1(context,next){  console.log('middleware 1');  next().then(data=>console.log(data));  console.log('middleware 1');  return 'middleware 1 return'; } function f2(context,next){  console.log('middleware 2');  next().then(data=>console.log(data));  console.log('middleware 2');  return 'middleware 2 return'; } function f3(context,next){  console.log('middleware 3');  next().then(data=>console.log(data));  console.log('middleware 3');  return 'middleware 3 return'; }var middleware=[ f1,f2,f3]var context={};var next=function(context,next){  console.log('middleware 4');  next().then(data=>console.log(data));  console.log('middleware 4');  return 'middleware 4 return';};compose().then(data=>console.log(data));

直接運(yùn)行結(jié)果如下:

"middleware 1"

"middleware 2"

"middleware 3"

"middleware 4"

"middleware 4"

"middleware 3"

"middleware 2"

"middleware 1"

"fn is undefined"

"middleware 4 return"

"middleware 3 return"

"middleware 2 return"

"middleware 1 return"

按著代碼運(yùn)行流程一步步分析:

dispatch(0)

i==0,index==-1 i>index 往下

index=0fn=f1Promise.resolve(f1(context, dispatch.bind(null, 0 + 1)))

這就會(huì)執(zhí)行

f1(context, dispatch.bind(null, 0 + 1))            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 石景山区| 五常市| 武定县| 桂平市| 峡江县| 吉林省| 昆山市| 安岳县| 漾濞| 祁连县| 赤城县| 龙胜| 犍为县| 武汉市| 屯昌县| 雷州市| 东光县| 宁河县| 南溪县| 分宜县| 兴化市| 邹平县| 邻水| 隆子县| 祥云县| 盐津县| 施甸县| 南充市| 闽清县| 石楼县| 栾城县| 普定县| 南投县| 荔波县| 朝阳县| 莲花县| 湘西| 阿瓦提县| 广灵县| 广灵县| 鄂伦春自治旗|