javascript - 为什么 setTimeout 调用会产生不同的结果

标签 javascript timer settimeout

我有下一个代码

setTimeout(function() {
  setTimeout(function() {
    console.log('foo');
  }, 50);
}, 100);

setTimeout(function() {
  setTimeout(function() {
    console.log('baz');
  }, 100);
}, 50);

问题是输出是什么。但是在运行代码时,我在多次运行中得到了不同的结果——有时是 foo baz,有时是 baz foo

所以有两个问题:

1) 为什么我有不同的结果?

2) 为什么有时我得到 baz foo

enter image description here

附言有代码片段,但使用代码片段我总是得到相同的结果 附言如果它是特定于环境的——我使用 Chrome(和 FF),但问题仍然存在 附言可能的答案是关于使用 console.log,但是对于

var a = []; 
setTimeout(function() { 
     setTimeout(function() { 
       a.push('foo'); 
      }, 50); 
 }, 100); 
 setTimeout(function() { 
     setTimeout(function() { 
       a.push('baz'); 
     }, 100); 
  }, 50); 
 setTimeout(function() { console.log(a); }, 300);
它仍然是真实的

最佳答案

指定的超时时间是浏览器在执行函数之前应该等待的最短时间,而不是保证时间。如果浏览器在计时器关闭时忙于做其他事情,该功能将被延迟。

因此,当您将计时器安排为 50 毫秒时,它可能要到 53 毫秒后才会真正运行。然后它将在此之后设置另一个计时器 100 毫秒,即您开始后的 153 毫秒。同时,设置为 100 毫秒的计时器可以在 101 毫秒后运行,然后将其第二个计时器设置为 50 毫秒后,即一切开始后的 151 毫秒。在此示例中,它将打印 foo bar

或者您可以得到不同的延迟,结果将是 bar foo

如果您需要按特定顺序执行操作,您应该在单个函数中按顺序运行它们,或者从第一个函数的回调中调用第二个函数,或者以特定顺序使用 promises。依赖于 setTimeout 的精确毫秒计时是不可靠的。

关于javascript - 为什么 setTimeout 调用会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277394/

相关文章:

javascript - 将命名对象替换为该对象的属性

javascript - setTimeout 并没有忠实于我在 $.each 中给出的延迟

javascript - React.js 和 Firebase 身份验证 : setTimeout Callback function not executed?

javascript - 添加然后在延迟后删除类但没有页面刷新

javascript - wysihtml5 文本区域大小调整

javascript - 在 Firefox 悬停时从中心调整动画大小

javascript - Chart.js 无法读取未定义的属性 'fontSize'

c# - C# 中的计时器或 webclient 以某种方式保留先前的变量值

.net - 使用与 Parallel.ForEach 同时运行的计时器防止线程池饥饿

android - 如何从一个 Activity 启动计时器并从另一个 Activity 停止?