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