Node异步编程体验

直接看代码:

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>>






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值