第一个 .subscribe 上的 BehaviorSubject<Object[]> returns 错误数组

BehaviorSubject<Object[]> returns faulty array on first .subscribe

我有一个 BehaviorSubject 和第一个 .subscribe 回调 returns 一个包含 6 个对象的数组,在控制台输出上,它显示 length: 6 但每个 for 循环只迭代 5 次甚至console.log(arr.length) 输出 '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);
                }
            });

输出:

怎么会这样?许多不同的服务写入 (objects.next) 到这个 BehaviorSubject,但是我怎样才能防止这种情况发生呢? 它只发生在第一次 'objects' 是 .next-ed 时,从第二个 .next 开始,此代码完美运行并显示实际长度。

我还在数组上测试了 .find 和 .filter,但它只能过滤最后 5 个条目而不是第一个

首先:您的行为主题应该是受保护的或私有的。否则你就是在暴露漏洞。

话虽如此。您正在创建一个初始值为 ([]) 的行为主体。当您订阅时,会发出该值 ([])。然后,第一个 next() 发出一个新值。因为两者重叠,所以你得到一个 6 长度的数组。如果我没记错的话,如果你使用 Subject() 而不是 BehaviorSubject,这不应该发生,或者仅仅是 console.log 输出太多的错误。