手把手教你:CSS + JS实现文本交替
admin
2024-03-04 19:58:48
0

1. Koa 中间件

Koa 的中间件通过一种更加传统的方式进行级联,摒弃了以往 node 频繁的回调函数造成的复杂代码逻辑。使用异步函数,我们可以实现"真正" 的中间件。与之不同,当执行到 yield next 语句时,Koa 暂停了该中间件,继续执行下一个符合请求的中间件(‘downstrem’),然后控制权再逐级返回给上层中间件(‘upstream’)。(koa中文文档的描述

koa的文档上有个非常代表性的中间件执行 gif 图。

2. Koa Compose 源码解析

2.1 test.js测试compose的代码,先对compose的使用有个了解

//test.js
function wait(ms) {return new Promise((resolve) => setTimeout(resolve, ms || 1));
}function isPromise(x) {return x && typeof x.then === "function";
}describe("Koa Compose", function () {it.only("should work", async () => {const arr = [];const stack = [];//这里删除了部分测试代码stack.push(async (context, next) => {arr.push(1);await wait(1);await next(); //dispatch(1)await wait(1);arr.push(6);});stack.push(async (context, next) => {arr.push(2);await wait(1);await next(); //dispatch(2)await wait(1);arr.push(5);});
//调用compose方法,传入异步任务队列,执行compose返回await compose(stack)({});expect(arr).toEqual(expect.arrayContaining([1, 2, 5, 6]));});}); 

2.2. compose源码解析

 function compose(middleware) {if (!Array.isArray(middleware))// 判断middleware是否是数组,判断数组的方法能想到几种呢throw new TypeError("Middleware stack must be an array!");for (const fn of middleware) {// 判断middleware里面的数据是否是函数, 顺便了解下for of 语法if (typeof fn !== "function")throw new TypeError("Middleware must be composed of functions!");}/** * @param {Object} context * @return {Promise} * @api public */return function (context, next) {// last called middleware #let index = -1;return dispatch(0);function dispatch(i) {if (i <= index)//如果i==index说明,同一个dispatch(fn里面的next)调用了多次,抛出错误return Promise.reject(new Error("next() called multiple times"));index = i;let fn = middleware[i];if (i === middleware.length) {// compose(stack)({}),没有传递第二个参数,所以next=undefinedfn = next;}if (!fn) {return Promise.resolve();}try {//这里取middleware的函数去执行,函数内部执行next(),执行middleware的下一个函数return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));} catch (err) {return Promise.reject(err);}}};
}
/*
测试脚本的调用流程
dispatch(0) 
调用stack[0]的方法, 内部next()调用的是 dispach(1)arr=[1]dispach(1) 
调用stack[1], next= dispatch(2)arr=[1,2]当2==middleware.length ,compose(stack)({}),没有传递第二个参数,所以next=undefined
后面的就是顺序执行await wait(1);arr.push(5);await wait(1);arr.push(6);
*/ 

2.3. vsCode中debug方法截图

在package.json里找的script,有有Debug的按钮,点击选择执行test

扩展: redux中compose的代码

function compose(...funcs: Function[]) {if (funcs.length === 0) {// infer the argument type so it is usable in inference down the linereturn (arg: T) => arg}if (funcs.length === 1) {return funcs[0]}return funcs.reduce((a, b) =>(...args: any) =>a(b(...args)))
} 

3.小结

koa-compose源码比较少,调试了好几遍才理解执行流程和原理。其中包含着闭包、Promise、bind等基础知识。 熟悉了 koa-compose 中间件常说的洋葱模型,学会了部分 jest 用法,如果单独执行某一个单元测试,可以使用it.only()。

it.only('should work', async () => {//xxxx
}) 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

相关内容

热门资讯

开硬折扣超市,收购量贩零食,三... 文丨刘纾含 编辑丨卢枕 最近,三只松鼠的日子过得不太平。随着收购爱零食的计划搁浅,本就步履维艰的线下...
入夏肾气易亏?广东人靠这8种清... 入夏肾气易亏?广东人靠这8种清润食材,煲汤养肾又去湿 —— 润夏不伤身,调肾正当时 一、夏日热蒸蒸,...
酸菜控必看!解锁酸菜新吃法,美... 谁懂啊!酸菜焖土豆能这么香,米饭又要遭殃咯 家人们,今天必须给你们分享一道能让味蕾直接“起飞”的家常...
原创 小... 标题:小河虾这么做老公最爱,隔三差五就想吃,每次做一大盘都吃光光。 在美食的世界里,有一种味道能够...
入伏后胃口差,惦记吃这3道清淡... 入伏后的高温真是让人没啥胃口,尤其是那种燥热感,一下子就让食欲降到最低了。这时候,大家往往都不想吃那...
肾虚怕冷易乏力?这7种家常食材... 肾虚怕冷易乏力?这7种家常食材坚持吃,早晚养肾见改善 ——唤醒身体深处的温热力量,从饮食开始 一、寒...
广东养生老传统:这7种常见食材... 广东养生老传统:这7种常见食材煲汤,一周三次,养肾润燥 入秋一场风,老友奔药棚。气候一转,体内干燥上...
探访新职业|“食品展示策划师”... 直播间里的美食为啥总是这么诱人?当李佳琦咬下手抓饼锅盔的酥脆声透过直播间麦克风清晰传出,当助播庆子指...
盐城响水县:斑节虾跳向大江南北 夏夜的江苏盐城响水县三圩盐场,灯光映照下,水面泛起粼粼波光,一筐筐活蹦乱跳的斑节虾被捕捞上岸,这些素...
C位!顶流!就在湖北! “没有小龙虾的夏天是不完整的” “啤酒+小龙虾,快乐回来啦”……炎炎夏日作为餐桌上的顶流代表中国“深...
关于李连杰电影的配音的问题 关于李连杰电影的配音的问题李连杰普宏源通话说的不咐蠢是很好吧?为了观看效果而已...不是一个配音演员...
蟑螂屎能够入药? 蟑螂屎能够入药?蟑螂屎能够入药吗?可以的啊!!
大话西游2凌虚步的宝箱怎么打开... 大话西游2凌虚步的宝箱怎么打开?那个宝箱就加锁的跟直接自己的物品怎么解锁吧?跟解锁自己的物品一样 点...
阿长与山海经 阅读 阿长与山海经 阅读1.郑重 臂膊 磨难2. D3.语言 郑重.认真4.严肃.虔诚5.让我记起她...
绿野仙踪结局 绿野仙踪结局绿野仙踪》的结局是可恶的女巫死了,世界恢复和平的。多萝西的几个好朋友分别获得了各自需要的...
家访活动总结 家访活动总结 学校教育需要社会的配合,更需要家长的信任和支持。家访是学校获得家长信任与支持的重要途径...
找一个恋爱养成游戏 找一个恋爱养成游戏推荐你玩“明星志愿”系列,特别是“明星志愿2”还有“美少女梦工厂4”也可以,画面挺...
(急!~~~~~)被牛蚊子叮了... (急!~~~~~)被牛蚊子叮了怎么办我的脚3天前辈牛蚊子(不是蚊子是牛蚊子)叮咬了,现在红肿,痒,有...
事业,金钱,爱情,朋友,什么最... 事业,金钱,爱情,朋友,什么最重要?朋友最重要,有了真诚朋友了,你会在长期的交往中,慢慢收获爱情!收...