博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
connect.js中间件实现之函数队列思想
阅读量:7061 次
发布时间:2019-06-28

本文共 1203 字,大约阅读时间需要 4 分钟。

首先,提出一个问题,用程序实现程序员一天todolist

  1. fn1(){ 起床 }
  2. fn2(){ 上班 }
  3. fn3(){ 开会 }
  4. fn4(){ 吃饭 }
  5. fn5(){ 敲代码 }
  6. fn6(){ 泡segmentfault }

最简单的实现:

function todolist() {
fn1();
...
fn6();
}
但存在一个问题,就是这个list要事先安排好的,但现实生活中,list不可能完美的计划每一天的事情,事件的发生是动态的。需要在执行的过程中动态的加载进来,这个时候在程序实现上可以预先定义一个数组,添加函数的时候把函数push 进去,需要的时候从数组中按顺序一个个取出来,依次调用。
var stack = [];
// 执行
stack.push(fn1);
stack.push(fn3, fn4);
// 匿名函数添加
stack.push(function(){
喝水
})
// 调用的时候
stack.forEach(function(fn) { fn() });
完美的实现了这个dolist,但爱好思考的你,一定会发现问题,事情之间不是完全独立的,经常存在着很强的关联性,如fn5依赖fn3的结果,也就是fn3没有执行完,就不能执行fn5,js是单线程异步执行的,以上的实现方式无法保证吧,那就要在此基础上进行完善。学习编程的第一堂课,大都是C语言吧,一个很重要的概念就是指针,指来指去挺让人晕的。那么可以借助该思想。 也就是stack[0]执行完后将函数队列中的索引+1,指向stack[1]函数,依次执行,这样就完美的解决了各函数间依赖关系,那么程序上该怎么实现?

var stack = [];var index =0 ;function next(){  var fn = stack[index];  index = index + 1;  if (typeof fn === 'function') fn();}function fn1() {    console.log('函数1');    next();};stack.push(fn1); function fn2() {    setTimeout(function fn2Timeout() {         console.log('函数2');         next();    }, 500);}stack.push(fn2, function() {    console.log('函数3');    next();}); next();

这样函数队列就像多米诺骨牌那样触发第一个后,依次按顺序倒下,看到next(),是不有点熟悉,在express中大量的出现,它的核心库connect.js就是基于函数队列的思想实现的,源码一百多行,代码写法也很经典,是学习源码的不错题材

转载地址:http://yifll.baihongyu.com/

你可能感兴趣的文章
oracle 查看 、创建、删除 dblink
查看>>
spring boot 1.x 拦截器
查看>>
reactjs 分模块学习
查看>>
Android中Messenger的使用
查看>>
判断矩形相交
查看>>
html笔记
查看>>
[Java]安装Tomcat
查看>>
linux下进度条的简单实现
查看>>
我的友情链接
查看>>
Android项目中引用外部项目library失败的原因
查看>>
线性回归原理和实现基本认识
查看>>
类的生命周期
查看>>
Docker 入门及安装[Docker 系列-1]
查看>>
java中使用反射获取pojo(实体)类的所有字段值
查看>>
Linux - 常用参考资料(持续更新)
查看>>
运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本
查看>>
Linux - tar命令详解
查看>>
DFA和NFA
查看>>
NTP常见问题和解决方案&配置文件详解
查看>>
XmlParser和HtmlParser
查看>>