Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript设置超时0阻止页面呈现?_Javascript_Ajax_Settimeout - Fatal编程技术网

JavaScript设置超时0阻止页面呈现?

JavaScript设置超时0阻止页面呈现?,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,根据这个问题 更改DOM是同步的。呈现DOM实际上是在清除JavaScript堆栈之后发生的 根据google doc,屏幕刷新速率60fps相当于大约每16ms刷新一次,我写了这个例子: <!DOCTYPE html> <html> <head> <script> document.addEventListener('DOMContentLoaded', function() {

根据这个问题

更改DOM是同步的。呈现DOM实际上是在清除JavaScript堆栈之后发生的

根据google doc,屏幕刷新速率60fps相当于大约每16ms刷新一次,我写了这个例子:

<!DOCTYPE html>
<html>
    <head>
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                document.querySelector('#do').onclick = function() {
                    document.querySelector('#status').innerHTML = 'calculating...';
                    // setTimeout(long, 0); // will block
                    setTimeout(long, 1); // will not block
                };

                function long(){
                  let result = 0
                  for (let i = 0; i < 1000; i++) {
                    for (let j = 0; j < 1000; j++) {
                      for (let k = 0; k < 1000; k++) {
                        result += i + j + k;
                      }
                    } 
                  }
                  document.querySelector('#status').innerHTML = 'calculation done';
                  document.querySelector('#result').innerHTML = result.toString();
                }
            });
        </script>
    </head>

    <body>
        <button id='do'> Do long calc!</button>
        <div id='status'></div>
        <div id='result'></div>
    </body>
</html>

document.addEventListener('DOMContentLoaded',function(){
document.querySelector('#do').onclick=function(){
document.querySelector(“#status”).innerHTML='computing…';
//setTimeout(长,0);//将阻止
setTimeout(长,1);//将不会阻止
};
函数long(){
设结果=0
for(设i=0;i<1000;i++){
对于(设j=0;j<1000;j++){
for(设k=0;k<1000;k++){
结果+=i+j+k;
}
} 
}
document.querySelector(“#status”).innerHTML=“计算完成”;
document.querySelector(“#result”).innerHTML=result.toString();
}
});
做长计算!
用jsfiddle

我仔细研究了代码,发现阻塞发生的时间延迟在12毫秒以下,并且发生的频率更高,延迟更小

我有两种不同的理解方式:

  • 在这种情况下,只有延时超过16ms的
    setTimeout
    不应阻塞,延时0和1远小于16ms,因此两者都应阻塞

  • setTimeout
    调用和
    long
    推送到消息队列(可选延迟)之后,现在调用堆栈为空,因此在这两种情况下
    setTimeout
    都不应阻塞,并且始终呈现“计算…”


  • 我的理解有什么问题?

    这可能与你的工作有关


    它看起来好像大多数浏览器都忽略了0的值,可能值得查看浏览器的
    DOM\u MIN\u TIMEOUT\u值。

    这可能与您的浏览器有关


    它读起来好像大多数浏览器都忽略了0的值,可能值得查看浏览器的
    DOM\u MIN\u TIMEOUT\u值。

    谢谢reddington,这正是我要找的!请详细说明ad MDN提供的信息。如果没有链接,您的答案无法提供足够的信息。至少引用相关信息。谢谢雷丁顿,这正是我要找的!请详细说明ad MDN提供的信息。如果没有链接,您的答案无法提供足够的信息。至少引用相关信息。