【发布时间】:2018-03-02 02:10:39
【问题描述】:
我收到 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 不是,我会尝试再次运行它那里。
但是,我猜是因为它运行了很多次,所以它给了我一个调用堆栈错误。
解决此问题或解决此问题的最佳方法是什么?
【问题讨论】:
-
这看起来像一个被用作锤子的手机。当然,更好的解决方案是等待设置
user.orderData.pendingItem完成。至少,为此添加某种延迟。 -
即使你让它工作了,你也基本上做了一个
while(true),但它是递归的。最好将pendingItem设为一个承诺,无论它被填充在哪里,然后在您的代码中您就可以解决它。这样您就不会在等待完成时创建调用堆栈。 -
@ug_ 我同意你的评论。但是我目前的问题是所有数据都存储在内存中,而
user或orderData实际上应该存储在数据库中,以便我可以在查询上做出承诺。但是,在我获得批准继续使用数据库之前,我几乎被困住了。
标签: javascript node.js promise callstack botkit