connect.js中间件实现之函数队列思想

首先,提出一个问题,用程序实现程序员一天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就是基于函数队列的思想实现的,源码一百多行,代码写法也很经典,是学习源码的不错题材

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值