Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 行为主体<;对象[]>;返回第一个错误的数组。订阅_Angular_Typescript_Ionic Framework_Ionic4_Ionic Native - Fatal编程技术网

Angular 行为主体<;对象[]>;返回第一个错误的数组。订阅

Angular 行为主体<;对象[]>;返回第一个错误的数组。订阅,angular,typescript,ionic-framework,ionic4,ionic-native,Angular,Typescript,Ionic Framework,Ionic4,Ionic Native,我有一个BehaviorSubject和第一个.subscribe回调返回一个包含6个对象的数组,在控制台输出上,它显示length:6,但每个for循环只迭代5次,甚至console.log(arr.length)输出“5” 我真的不知道如何重现这一点,但我没有以下代码: public objects: BehaviorSubject<Object[]> = new BehaviorSubject([]); // other class this.obje

我有一个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);
                }
            });
public对象:BehaviorSubject=newbehaviorsubject([]);
//其他类
this.objectService.objects.subscribe(\u objects=>{
if(_对象){
for(对象的常量对象){
控制台日志(obj);
}
console.log(_对象);
console.log(_objects.length);
}
});
输出:

这怎么会发生?很多不同的服务都会向这个行为主体写入(objects.next),但是如何防止这种情况发生呢? 它只在第一次编辑“objects”时发生。下一次编辑,从第二次编辑开始。下一次在这段代码中工作完美,并显示了实际长度


我还测试了数组中的.find和.filter,但它只能过滤最后5个条目,而不能过滤第一个条目:您的行为主体应该是受保护的或私有的。否则,您将面临漏洞


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

最初是[],但后来才订阅,然后一些代码会订阅。下一次,这总是发生=>错误的长度。接下来调用console.log和UI中的所有结果都是正确的。我有时会犯这样的错误,但我始终无法解决它。如果您知道typescript中的什么会导致这种情况,请重新播放。有时,输出甚至在开始时显示数组(5),所有输出都相同。它的wiredThing是console.log,有时会显示“刚刚计算过”的值。您应该使用调试对这些类型的问题进行排序,因为.log会欺骗您。另一方面,我不确定我告诉您的内容是否对您有所帮助,但请尝试将其更改为Subject(),因为BehaviorSubjects总是在订阅时获得一个值(最后一个值)。除非您在发出时已订阅,否则主题不会获得值。还有ReplaySubject等。检查它!rxjs很有趣(说实话!)我从今天早上就开始尝试解决这个问题。它似乎总是跳过数组的第一个条目。我现在唯一能做的就是使用不同的行为子对象来跟踪数组中不同类型的数量,因为这个
for(const obj of _objects)
在第一次调用它时永远不会起作用