外星人源码论坛 首页 编程经验 connect.js中间件实现之函数队列思想

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

2018-3-5 06:35
原作者: 外星人源码网 来自: 外星人源码网 收藏 分享 邀请

首先,提出一个问题,用程序实现程序员一天todolistfn1(){ 起床 } fn2(){ 上班 } fn3(){ 开会 } fn4(){ 吃饭 } fn5(){ 敲代码 } fn6(){ 泡segmentfault }最简单的实现:function todolist() { fn1(); . ...

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

    fn1(){ 起床 } fn2(){ 上班 } fn3(){ 开会 } fn4(){ 吃饭 } fn5(){ 敲代码 } 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人参与评论

请发表评论

全部评论

粉丝 阅读103 回复0
上一篇:
iframe跨域通信实战发布时间:2018-03-05
下一篇:
vagrant 安装整合发布时间:2018-03-05
推荐资讯
阅读排行
国内最专业的源码技术交流社区
全国免费热线电话

0373-5171417

周一至周日9:00-23:00

反馈建议

admin@eenot.com 在线QQ咨询

扫描二维码关注我们