【发布时间】:2020-02-04 07:56:19
【问题描述】:
假设我有以下for 循环,这显然会阻塞事件循环一段时间:
function somethingExpensive() {
let i = 0;
while (true) {
// Something expensive...
if (++i === 1e10) return 'Some value.'
}
}
我可以将该操作(for 循环)包装在 Promise 中,这样它就不会阻塞“主线程”吗?
类似的东西:
function somethingExpensive() {
return new Promise((resolve) => {
let i = 0;
while (true) {
// Something expensive...
if (++i === 1e10) resolve('Some value.');
}
});
}
【问题讨论】:
-
Javascript 在设计上是单线程的。 Promise promise 将来会在某个时候执行,但它们仍然会阻塞主线程。不过,您可以解决这个问题。在节点中,使用multi-threading。在网络上,使用service workers
-
不,因为一旦 Promise 执行器中的代码启动,它将一直持续到它结束 - 并且 Promise 执行器无论如何都是同步执行的,因此该解决方案中根本没有异步
-
除非你使用异步工作者,否则任何需要很长时间的东西都会阻塞事件循环。主事件循环将所有事件处理程序排入队列,因此您不应运行任何需要超过几毫秒才能完成的操作,否则您的页面会感觉迟滞或无响应。
标签: javascript loops promise