javascript - setTimeout() 是否在单独的线程上运行?

标签 javascript settimeout

想知道 setTimeout() 是否会异步启动,我尝试了以下测试脚本:

function timedText() {
  var x = document.getElementById("txt");
  setTimeout(function() {
    x.value = "1 second"
  }, 1000);
  setTimeout(function() {
    x.value = "2 seconds"
  }, 2000);
  setTimeout(function() {
    x.value = "3 seconds"
  }, 3000);

  while (true) {}
}
<p>Click on the button below. The input field will tell you when two, four, and six seconds have passed.</p>

<button onclick="timedText()">Display timed text</button>
<input type="text" id="txt">

果然,点击按钮会导致浏览器挂起

这告诉我 setTimeout() 确实在单独的线程上运行。

但是在最近的一次面试中,面试官提出了不同的建议...这是否意味着 setTimeout() 依赖于浏览器/实现?

最佳答案

JavaScript 不是多线程的。那么有WebWorkers在不同的线程中运行,但这并不是真正的多线程,更像是相互通信的多个进程。

从那时起,while (true) {} 将阻塞 js 上下文,因为它是一个无限循环。

setTimeout 会注册一个函数供以后执行。但是代码绝不会针对相同的上下文并行运行。

while (true) 本身不一定会创建阻塞循环:

async function sleep(time) {
  return new Promise((resolve, _) => setTimeout(resolve, time))
}

async function test(val) {
  while (true) {
    console.log('in while loop ' + val)
    await sleep(1000)
  }
}

test('foo')
test('bar')

所以你可以说使用 await/async 你可以创建某种协作式多任务处理,如设置,但仍然没有多线程

关于javascript - setTimeout() 是否在单独的线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51960879/

相关文章:

javascript - 模拟 net.Socket 进行单元测试

javascript - 当内容改变高度时动态改变容器 div 的高度

javascript - 根据一定的时间延迟执行函数并忽略其他函数的执行

javascript - Bootstrap 3 : how to set the list to expand

javascript - 如何多次使用州下拉菜单和城市下拉菜单javascript而不影响其他下拉菜单

javascript - setTimeout 函数意外行为

JavaScript/JQuery : Need a time Delay

当笔记本电脑盖子关闭时,Javascript settimeout 计时器停止

jQuery 设置超时并显示

javascript - 如何在 Backbone 事件对象中使用变量?