0

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

4

1 回答 1

0

因为这是 的性质BehaviourSubject,所以显示“当前”值,或者在这种情况下是推送给它的最后一个值(不知道 push 它是否是正确的词,但这只是为了解释目的)。当您使用该next()方法向主题添加值时,它会显示最后一个值,在这种情况下,它将显示最后一个值,因此,只循环一次(因为最后一个值它只是一个)。

也许你应该阅读这篇 Medium 文章,Rx.Subject()以更好地了解它们的工作原理和作用:

理解 rxjs BehaviorSubject、ReplaySubject 和 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()

于 2018-06-07T22:59:54.307 回答