Цикл для потока 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 ответ

Потому что такова природа BehaviourSubjectпокажите "текущее" значение или, в этом случае, последнее значение, добавленное к нему (не знаю, является ли нажатие правильным словом, но это только для целей объяснения). Когда вы используете next() метод добавления значений к предмету, он покажет вам последнее значение, в этом случае он покажет вам последнее значение, следовательно, цикл только один раз (потому что последнее значение это только один).

Может быть, вы должны прочитать эту статью о средних 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()

Другие вопросы по тегам