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