我正在做购物车应用程序,当用户从清单中取消选择项目时,我需要从总金额中减去,并且我每次用户通过共享服务添加或删除时,都使用行为主体更新总金额。从总额减去负数后,我再次相应地更新Subject值。但是在这里,我的错误堆栈超出了。
onItemDeSelect(uncheckedItem) {
this.eachItem.itemExtraOptionPrice.prices.forEach(item => {
this.shared.updateAmountValue.subscribe(value => {
if (item.id === uncheckedItem.id) {
this.totalAmount = value - item.amount;
this.shared.updatedAmount(this.totalAmount);
}
});
});
}
updateAmountValue: BehaviorSubject<number> = new BehaviorSubject(0);
updatedAmount(value) {
this.updateAmountValue.next(value);
}
这里onItemDeSelect()函数每次在取消选择项时执行,然后更新共享服务中的总额。我不知道我在哪里做错。
答案 0 :(得分:1)
最大调用堆栈超出错误多数将在函数进行无限递归时发生。在编码中这不是很明显,您已经订阅了可以再次更新值的东西。在您的代码中,您正在
this.shared.updatedAmount(this.totalAmount);
这将更新该值并激发行为主体一个偶数
updateAmountValue: BehaviorSubject<number> = new BehaviorSubject(0);
您已经订阅了该主题,它将再次更新该值,依此类推,将导致无限递归状态。
可能的解决方案
您可以直接获取主题的价值,而不用订阅它。
onItemDeSelect(uncheckedItem) {
this.eachItem.itemExtraOptionPrice.prices.forEach(item => {
let value = this.updateAmountValue.getValue();
if (item.id === uncheckedItem.id) {
this.totalAmount = value - item.amount;
this.shared.updatedAmount(this.totalAmount);
}
});
}
这不会导致任何递归条件。希望这会有所帮助。