在BehaviorSubject流上循环

时间:2017-09-04 14:05:37

标签: angular typescript rxjs observable behaviorsubject

我的线程变量包含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个元素。 然后它只迭代最后一个元素。

1 个答案:

答案 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()