【发布时间】:2018-07-20 07:52:09
【问题描述】:
结果是the while loop blocks the event loop in JavaScript,如果您希望您的应用程序响应外部/异步事件,这会阻止它成为创建运行循环的可行解决方案。
我的问题是,使用什么技术可以使“运行循环”无限/恒定但仍然具有高性能并且不会阻塞事件循环。
我运行了一个快速测试来查看while、setTimeout(fn, 0)(浏览器)和setImmediate(fn)(node.js)的性能。
var x = 1000
var isNode = typeof window == 'undefined'
function a() {
var start = (new Date()).getTime()
var q = 0
function next() {
q++
if (q < x) {
if (isNode) {
setImmediate(next)
} else {
setTimeout(next, 0)
}
} else {
var end = (new Date).getTime()
console.log('a', end - start)
}
}
next()
}
function b() {
var start = (new Date()).getTime()
var q = 0
while (q < x) {
q++
}
var end = (new Date).getTime()
console.log('b', end - start)
}
a()
b()
node.js:
a = 20
b = 0
浏览器:
a = 5039
b = 0
有没有一种方法可以像在 JavaScript 中执行 while 循环一样高效地执行“无限 while 循环”。 setImmediate 比 setTimeout 快得多,但仍然比基本的 while 循环慢很多。
【问题讨论】:
-
为什么你需要一个无限循环?浏览器事件循环的重点就是这样做。您想处理哪些事件循环无法处理的外部/异步事件? (真诚地问)
-
事件循环是应用程序运行循环。除非你想要一些恒定节奏的间隔,例如用于渲染循环或物理引擎。
-
@LancePollard 只需将虚拟机放在自己的线程中(客户端的 webworker,节点上的子进程)。
-
基于浏览器的 JS,我认为 JS 通常被优化以响应事件,而不是长时间只做一件事。事件循环是监视事件的无限循环。因此,如果您有一个循环正在运行,那么就没有时间响应事件。
-
@Nishant 正确,这是我发布的第一个链接。问题是解决方法是什么。
标签: javascript event-loop