我有一个BehaviorSubject,并且第一个.subscribe回调返回一个包含6个对象的数组,并且在控制台输出上,它显示length: 6
,但是每个for循环仅重复5次,甚至console.log(arr。长度)输出“ 5”
我真的不知道如何复制它,但是没有以下代码:
public objects: BehaviorSubject<Object[]> = new BehaviorSubject([]);
// other class
this.objectService.objects.subscribe(_objects => {
if (_objects) {
for (const obj of _objects) {
console.log(obj);
}
console.log(_objects);
console.log(_objects.length);
}
});
输出:
这怎么可能发生?许多不同的服务都向该BehaviorSubject写入(objects.next),但是如何防止这种情况发生? 仅在第一次“对象”被.next-发生时发生,此代码上的第二个“ .next”才完美工作并显示实际长度。
我还在数组上测试了.find和.filter,但是它只能过滤最后5个条目,而不能过滤第一个条目
答案 0 :(得分:1)
首先:您的“行为”主题应受保护或不公开。否则,您将面临漏洞。
话虽如此。您正在创建一个初始值为([])的行为主题。当您订阅时,将发出该值([])。然后,第一个“ next()”发出。由于两者重叠,因此您将获得一个6长度的数组。如果我没看错,那么如果您使用Subject()而不是BehaviorSubject,则不会发生这种情况,或者仅仅是console.log输出过多的错误。