首页 > 解决方案 > 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()取决于浏览器/实现?

标签: javascriptsettimeout

解决方案


JavaScript 不是多线程的。好吧,有一些WebWorkers在不同的线程中运行,但这并不是真正的多线程,更像是多个进程,它们相互通信。

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

setTimeout注册一个函数以供以后执行。但是任何时候代码都不会在相同的上下文中并行运行。

Awhile (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你可以创建某种协作多任务,比如设置,但仍然没有多线程


推荐阅读