gpt4 book ai didi

javascript - 递归新 Promise : RangeError: Maximum call stack size exceeded

转载 作者:行者123 更新时间:2023-12-01 03:03:35 24 4
gpt4 key购买 nike

我收到 RangeError:超出最大调用堆栈大小

function getUser(userId) {
return new Promise((resolve, reject) => {
controller.storage.users.get(userId, function(err, user) {
if (err) reject(err);

if (user) {
if(!(user.orderData.pendingItem)) {
getUser(userId)
}
else {
resolve(user.orderData.pendingItem);
}
}
})
})
};

我遇到的困境是,每当我运行controller.storage.users.get时,它并不总是立即解析用户对象的所有属性和值,这就是为什么我如果 orderData.pendingItem 不存在,请尝试再次运行它。

但是,我想因为它运行了很多次,所以给了我一个调用堆栈错误。

处理此问题或解决此问题的最佳方法是什么?

最佳答案

理想情况下,您应该监听某些事件而不是轮询,但要理解这是一个临时解决方法......

new Promise()同步运行其构造函数,看起来 controller.storage.users.get()还同步运行其回调。通过强制递归可以避免“超出最大调用堆栈大小”的可能性getUser()异步调用,最简单的方法是链接 new Promise().then(/* recurse from here */) .

function getUser(userId) {
return new Promise((resolve, reject) => {
controller.storage.users.get(userId, function(err, user) {
if (err) reject(err);
if (!user) reject(new Error('no user for id: ' + useId)); // this branch needs to be catered for
resolve(user); // make `user` available to the .then() below
});
}).then(function(user) {
return (user.orderData && user.orderData.pendingItem) || getUser(userId); // compact and safe
});
}

这应该可以完成工作,但如果没有“最大调用堆栈大小”保护,很可能会无缘无故地烧毁一两个处理器。

正如上面评论中所建议的,您可以而且可能应该在递归中添加一些延迟:

function delay(t) {
return new Promise(function(resolve) {
setTimeout(resolve, t);
});
}

function getUser(userId) {
return new Promise((resolve, reject) => {
controller.storage.users.get(userId, function(err, user) {
if (err) reject(err);
if (!user) reject(new Error('no user for id: ' + useId)); // this branch needs to be catered for
resolve(user); // make `user` available to the .then() below
});
}).then(function(user) {
return (user.orderData && user.orderData.pendingItem) || delay(200).then(function() { // adjust the delay to maximum acceptable value
return getUser(userId);
});
});
}

关于javascript - 递归新 Promise : RangeError: Maximum call stack size exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46331810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com