【问题标题】:BehaviorSubject<Object[]> returns faulty array on first .subscribeBehaviorSubject<Object[]> 在第一个 .subscribe 上返回错误数组
【发布时间】:2019-10-18 23:57:47
【问题描述】:

我有一个 BehaviorSubject,第一个 .subscribe 回调返回一个包含 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 个条目,而不是第一个

【问题讨论】:

  • 我从今天早上开始尝试解决这个问题。它似乎总是跳过数组的第一个条目。我现在唯一要做的就是使用不同的 BehaviorSubjects 来跟踪这个数组中不同类型的数量的完整解决方法,因为这个 for (const obj of _objects) 在第一次被调用时永远不会工作

标签: angular typescript ionic-framework ionic4 ionic-native


【解决方案1】:

首先:您的行为主题应该是受保护的或私有的。否则,您将面临漏洞。

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

【讨论】:

  • 最初它是 [] 但它只是稍后才被订阅,然后一些代码第一次 .next 并且这总是发生 => 错误的长度。任何后续的 .next 调用,console.log 和 UI 中的所有结果都是正确的。我有时会遇到这种错误,但我一直无法解决。最好知道打字稿中的什么会导致这种情况。有时i.imgur.com/oiA6acN.png 输出甚至在开始时显示 Array(5) 并且所有输出都相同。它的有线
  • 事情是 console.log 有时会显示“刚刚评估”的值。您应该使用调试来对这些类型的问题进行排序,因为 .log 会欺骗您。另一方面,我不确定我告诉您的内容是否对您有所帮助,但请尝试将其更改为 Subject(),因为 BehaviorSubjects 总是在订阅时获得一个值(最后一个值)。除非您在发出时订阅,否则主题不会获得值。还有 ReplaySubject 等。检查一下! rxjs 很有趣(说实话!)
猜你喜欢
  • 2020-08-04
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 2019-03-18
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多