想知道 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/