我的线程变量包含3个不同的元素。我想创建一个迭代这三个对象的For循环。
threads: BehaviorSubject<{[key: string]: Thread }> = new BehaviorSubject({});
这是我的功能:
searchUser(): Observable<Thread> {
this.searchArrayThreads = [];
let element = document.getElementById('chat-window-input');
return this.threads.map((threadDictionary: {[key: string]: Thread}) => {
for( let key in threadDictionary ) {
console.log("key", threadDictionary[key]);
if(threadDictionary[key].participants[0].name.startsWith(str)) {
return threadDictionary[key];
}
}
});
}
此功能仅适用于一次。在她的第一个电话中,她正在迭代3个元素。 然后它只迭代最后一个元素。
答案 0 :(得分:0)
因为这是BehaviourSubject
的性质,所以显示&#34;当前&#34;值或在这种情况下推送给它的最后一个值(不知道是否推送它是正确的词,但这只是为了解释目的)。当您使用next()
方法向主题添加值时,它将显示最后一个值,在这种情况下,它将显示最后一个值,因此,只循环一次(因为它的最后一个值&#39; s只有一个。)
也许您应该阅读这篇关于Rx.Subject()
的中篇文章,以便更好地了解它们的工作原理及其作用:
Understanding rxjs BehaviorSubject, ReplaySubject and AsyncSubject
在这个特定情况下不知道您当前的要求,但也许您可以concat()
上一个和最后一个值,或者可以选择ReplaySubject()
(向观察者发出所有值)。
像这样的东西(TS):
const currentValues: Thread[] = this.threads.getValues(); // "current" values
const newValues: Thread[] = newThreadsValues; //new Threads from somewhere
this.threads.next(currentValues.concat(newValues);
这适用于Thread
数组,但如果您只想添加一个Thread
实体,则应该选择Rx.ReplaySubject()