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