【发布时间】:2017-08-16 08:44:07
【问题描述】:
当您运行以下 javascript 代码时,它可以正常工作。但是如果你删除 setTimeout 函数调用并用如下代码行替换它:
resolve(x);
浏览器将挂起。
浏览器似乎挂起,因为它正在无限循环中处理对 processNode 函数的调用。但不清楚的是为什么会发生任何阻塞。 processNode 返回一个 Promise。此外,startNodeProcessing 是一个异步函数,它在调用中使用 await。我认为通过使用带有等待的 Promise 和 async 函数可以防止线程的任何阻塞,但显然我错了。看来 setTimeout 只是在单独的线程上执行其代码,从而防止阻塞。但如果是这种情况,为什么要从 Promise 或 async 函数开始呢?
function processNode(x) {
return new Promise(resolve => {
console.log("X: " + x + " " + Date.now());
setTimeout(() => {
resolve(x);
}, x);
});
}
async function startNodeProcessing() {
while(true) {
var a = processNode(1);
var b = processNode(1);
var c = processNode(1);
var d = processNode(1);
var a1 = await a;
var b1 = await b;
var c1 = await c;
var d1 = await d;
}
return;
}
startNodeProcessing();
【问题讨论】:
-
因为它产生的请求越来越多,这会使浏览器过载,并在一定时间内达到内存边界。
-
在
startNodeProcessing函数中使用while循环的目的是什么?注意,在使用await之前调用返回Promise的函数 -
JavaScript 是单线程的。 setTimeout 中的代码虽然是异步运行的,但仍然会阻塞主线程。
-
类似的代码会很有趣
-
@Frxstrem 但是 setTimeout 中的代码不会阻塞主线程,我真的怀疑无论 setTimeout 中的工作需要多长时间才能完成。
标签: javascript promise