![](/img/trans.png)
[英]Angular 2 - Uncaught (in promise): RangeError: Maximum call stack size exceeded
[英]Recursive new Promise: RangeError: Maximum call stack size exceeded
我收到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);
});
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.