Loop For для потока BehaviorSubject

98
10

Моя переменная потока содержит 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];
}
}
});
}

Эта функция работает только один раз. В своем первом звонке она повторяет три элемента. Затем он выполняет итерацию только на последнем элементе.

спросил(а) 2017-09-04T17:05:00+03:00 3 года назад
1
Решение
71

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

Может быть, вы должны прочитать эту Rx.Subject() статью о Rx.Subject() чтобы лучше понять, как они работают и что они делают:

Понимание rxjs BehaviorSubject, ReplaySubject и AsyncSubject

Не знаете ваши текущие требования в этом конкретном случае, но, возможно, вы можете concat() предыдущие и последние значения или, возможно, выбрать ReplaySubject() (которые излучают все значения наблюдателям).

Что-то ROUHHLY вроде этого (TS):

const currentValues: Thread[] = this.threads.getValues(); // "current" values
const newValues: Thread[] = newThreadsValues; //new Threads from somewhere

this.threads.next(currentValues.concat(newValues);

Это будет работать для массивов Thread но если вы хотите добавить только объект Rx.ReplaySubject() Thread вы должны пойти на Rx.ReplaySubject()

ответил(а) 2018-06-08T01:59:00+03:00 2 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема