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
注册一个函数以供以后执行。但是任何时候代码都不会在相同的上下文中并行运行。
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
你可以创建某种协作多任务,比如设置,但仍然没有多线程
推荐阅读
- arrays - Add a String to a value in an Array Powershell
- sql - 从 NSDictionary 生成 SQL 查询
- javascript - 如何在正则表达式中选择所有不以两个“..”(点)开头的href
- c# - Why access Task.Result in the synchronous mode doesn't cause a deadlock?
- sql - Select with limit for the same id
- android - 无法在 AndroidStudio 中运行我的第一个项目
- python - 如何将带有条件格式的 pandas df.to_html 表格式化为 Outlook?
- python - 带有 LDAP 和本地帐户的 Django Auth
- c# - 映射没有主索引但具有唯一索引的 Oracle 数据库表
- linux - 如何在 bash 中的 ssh 期望脚本中自动执行 ctrl+d 操作?