Пожалуйста, попробуйте заменить первую смешанную (pipe
и наблюдаемые операторы) часть на какой-то чистый массив наблюдаемых RxJS 5:
public test = Observable
.merge(
this.onUserNameUpdate()
.map(v => 'u'),
this.onPasswordUpdate()
.map(v => 'p'),
this.onAgeUpdate()
.map(v => 'a')
)
И посмотрите, перемещается ли ваш переключатель / случай соответственно.
Кроме того, я вижу, что вы получаете дополнительную информацию о пользователе в зависимости от того, какой источник запускает наблюдаемое действие, я бы заключил это в concatMap
:
.concatMap((trigger) => {
return this.store.select(getUserDetails)
.map(user => {
let ret = user;
ret.trigger = trigger;;
})
})
В конце вы получили информацию о пользователе с метаданными odчто вызвало изменение
РЕДАКТИРОВАТЬ
В результате вышеприведенного кода ваш поток должен выглядеть примерно так:
Каждая onXXXUpdate
функция, генерирующая наблюдаемый результат, объединяется с использованием merge
оператор:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-merge
Поскольку оператор слияния возвращает одну наблюдаемую, которая способна выдавать каждый тип значения, который испускаются его «дочерними» наблюдаемыми, в следующем операторе concatMap
мы отображаем каждое испускаемое значение (независимо от его источника) к новой наблюдаемой, которая создается как вывод из this.store.select(getUserDetails)
(я предполагал, что эта функция возвращает наблюдаемую, не так ли?).Чтобы отследить, что является триггером, мы добавляем эту информацию в качестве метаданных в ответ пользователя с помощью map
.После этого в конечном операторе у нас будет информация о пользователе с информацией о триггере, которая помогает определить, какие действия необходимо предпринять.