使用一个定时器和回调函数防止代码阻塞

问题:有一段代码可能比较耗费时间,并且在等待其完成的时候,你不想阻塞其他的代码处理。但是,当耗时的函数完成的时候,你确实需要执行一些其他的功能
解决方案:将一个回调函数和setTimeout()结合使用,定时器设置为0.

function factorial(n){
    console.log(n);
    return n==1? 1:n*factorial(n-1);
  }

  function noBlock(n,callback){
    setTimeout(function(){
        var val = factorial(n);
        if(callback && typeof callback =='function'){
            callback(val);
        }
    }, 0);
  }
  console.log("Top of the morning to you");
  noBlock(3,function(n){
    console.log('first call ends with '+n);
    noBlock(n,function(m){
        console.log('final call ends with '+m);
    });
  });
  var tst = 0;
  for(i = 0;i<10;i++){
    tst+=i;
   }
   console.log("value of tst is "+ tst);
   noBlock(4,function(n){
    console.log("end result is "+ n);
   });
   console.log("not doing too much");
   //输出
"Top of the morning to you"
"value of tst is 45"
"not doing too much"
3
2
1
"first call ends with 6"
4
3
2
1
"end result is 24"
6
5
4
3
2
1
"final call ends with 720"

分析:
+ 原理:回调函数的意思就是一个函数作为参数传递给另一个函数,在某个条件下在函数内部调用传入的函数,或者在一个进程的末尾调用它。
+ 定时器事件会像其他异步事件一样,添加到事件队列的末尾而不是立马挤入到队列之中。通常,和定时器事件相关的任何功能,都是在同一个队列中的任何其他功能之后处理的。
+ 通过把setTimeout的定时器设置为 0 ,我们在解决方案中所作的,只是创建一个事件并将其放到执行队列的末尾。通过将耗时的事件放入到定时器的进程中,我们在等待进程完成的同时不再阻塞其他任务的进行。
+ 如上:先执行了主程序的三个console.log;队列中的下一个事件是 noBlock(3,function(6));接着是noBlock(4,function(24));然后是noBlock(6,720));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值