码迷,mamicode.com
首页 > 编程语言 > 详细

javascript setTimeout 0

时间:2015-05-19 19:20:39      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

    本文提供了一个 javascript 方面的 setTimeout 的一个例子,在执行长时间的堵塞任务时,相关页面渲染会有问题,直接提供代码,拿代码说例子是最简单的:

    

<html>
<script src= "js/jquery-1.10.2.min.js" type="text/javascript"></ script>
<body>
        <button id= ‘do‘>Do long calc!</ button>
        <div id= ‘status‘></div >
        <div id= ‘result‘></div >

        <script type= "text/javascript">
              jQuery( ‘#do‘).on( ‘click‘, function(){
              jQuery( ‘#status‘).text(‘calculating....‘ );//此处会触发redraw事件的fired,但会放到队列里执行,直到long()执行完。
              
              
               // without set timeout, user will never see "calculating...."
              
               //long();//执行长时间任务,阻塞 // with set timeout, works as expected
              setTimeout( long,50);//用定时器,大约50ms以后执行长时间任务,放入执行队列,但在redraw之后了,根据先进先出原则
       })
       
        function long (){
               var result = 0
               for (
                      var i = 0; i<1000; i++){
                      for(var j = 0; j<1000; j++){
                            for (var k = 0; k<1000; k++){
                                  result = result + i + j + k;
                           }
                     }
              }
              jQuery( ‘#status‘).text(‘calclation done‘ )
               // has to be in here for this example. or else it will ALWAYS run instantly. This is the same as passing it a callback
       }
        </script>
</body>
</html>

    这个例子很有意思,如果不使用 setTimeout( long,50); 方法的话,页面执行过程中,是不会出现  calculating…… 的。

    

    javascript是JS运行在浏览器中,是单线程的,每个window一个JS线程,既然是单线程的,setTimeout(func, 0)神奇在哪儿?那就是告诉js引擎,在0ms以后把func放到主事件队列中,等待当前的代码执行完毕再执行,注意:重点是改变了代码流程,把func的执行放到了等待当前的代码执行完毕再执行。这就是它的神奇之处了。它的用处有三个:

1:让浏览器渲染当前的变化(很多浏览器UI render和js执行是放在一个线程中,线程阻塞会导致界面无法更新渲染)
2:重新评估”script is running too long”警告
3:改变执行顺序

例如:上面的例子,点击按钮就会显示"calculating....",如果删除setTimeout就不会。因为reDraw事件被进入事件队列到长时间操作的最后才能被执行,所以无法刷新。
两个地方可以执行 long() 方法   或者执行 setTimeout( long ,50);


javascript setTimeout 0

标签:

原文地址:http://my.oschina.net/alexgaoyh/blog/416881

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!