【发布时间】:2019-11-14 16:02:13
【问题描述】:
考虑一下这个sn-p:
function f() {
return new Promise((resolve, reject) => {
f().then(() => {
resolve();
});
});
}
f();
也可以这样写:
async function f() {
return await f();
}
f();
如果您运行给定的两个代码中的任何一个,您将面临以下错误:
(node:23197) UnhandledPromiseRejectionWarning: RangeError: Maximum call stack size exceeded
我的问题是为什么?在回答我的问题之前,请考虑一下我的论点:
我了解递归的概念以及在没有停止条件的情况下它如何导致堆栈溢出。但我在这里的论点是,一旦第一个 f(); 被执行,它将返回一个 Promise 并退出堆栈,所以这个递归不应该面临任何堆栈溢出。对我来说,这应该与以下行为相同:
while (1) {}
当然,如果我这样写,就修好了:
function f() {
return new Promise((resolve, reject) => {
setTimeout(() => {
f().then(() => {
resolve();
});
}, 0);
});
}
f();
这是一个不同的故事,我对此没有问题。
[更新]
我的错,我忘了提到我在服务器端使用node v8.10.0 进行测试。
【问题讨论】:
-
您正在寻找
Promise.resolve().then(f)或await; return f()。目前,您的递归调用正在立即发生。记住thenew Promiseexecutor callback is synchronous。 -
感谢@Bergi,但您的第二个建议是语法错误。
-
await undefined; return f()然后 :-)
标签: javascript recursion promise async-await stack-overflow