第一个 .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 输出太多的错误。
我有一个 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 输出太多的错误。