直接看代码:
var factorial = function(n, done) {
if (n <= 1) {
done(n, 1);
} else {
process.nextTick(function() {
var i = n - 1;
factorial(i, function(i, r) {
done(n, n * r);
});
});
}
}
var print_factorial = function(n, r) {
process.stdout.write("" + n + "! = " + r + "\n");
}
factorial(6, print_factorial);
------------------------------------------------
1. factorial用于计算一个整数n的阶乘,print_factorial用于在计算完成后的输出计算结果。
2. 关键点在于process.nextTick函数,此函数“应该”会将当前执行“执行路径”挂起,中断js执行栈,类似于Lua中的thread.yeild()。
不同于Lua的在于,Node会自动管理执行栈,当其它栈的“CPU slice time”用完后,会自动resume此执行栈,因此不需要thread.resume()了。
resume后,会执行process.nextTick(callback_func)参数中的callback_func. 这里的这个callback_func是个无参的匿名函数。
“按理”(参考Lua,参考Node中的EventEmitter)应该支持传递参数(这点待确认)。
3. 对于C程序员(或其它类C语言的程序员)来说,难点在于匿名callback_func中的后续操作。这里又递归调用了factorial用于计算n-1的阶乘。
而计算n-1的阶乘时,第二个参数需要一个callback_done的回调函数,用于回调通知阶乘计算完成。这段代码在此又传递了一个匿名函数。
此匿名函数的参数和callback_done要求的完全一致,第一个是数字i,第二个是i的阶乘的结果r。
4. 匿名callback_done函数内部只做一件事,通知计算完成,它是通过调用真正的factorial第二个参数的done回调函数完成的。
第一个参数n,表示完成了n的阶乘的计算,第二个参数是为n的阶乘的计算结果n*r 。r就是n-1的阶乘计算结果。
最后,还没理清同步拆分成异步的方法、步骤。记录在此,有待思考。。。
参考资料:
<<Node Web Development>>