Функция отображения RxJS внутри функции слияния - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь объединить 3 различных наблюдаемых и идентифицировать их как исходное значение. Также я получаю userDetails с последним из, чтобы я мог выполнять операции в зависимости от того, какая наблюдаемая была запущена (имя пользователя - u, пароль - p, age - a). Я уверен, что что-то не так в том факте, что я помещаю функции карты в Observable.merge, и поэтому независимо от того, какой Observable должен был вызывать мой источник, он всегда равен «u» в выражении «switch case».

@Effect
public test = Observable.merge(
  this.onUserNameUpdate().pipe(
    map(() => 'u')),
    this.onPasswordUpdate().pipe(
      map(() => 'p')), 
      this.onAgeUpdate().pipe(map(() => 'a')))
        .withLatestFrom(this.store.select(getUserDetails),
      (source, userDetails) => ({
        source,
        order
      })
  )
  .map((params) => {
    switch (params.source) {
      case 'u':
        // do smth with username
      case 'p':
        // do smth with password
      case 'a':
        // do smth with age
    }
    return {
      // some object
    }
  })

Может кто-нибудь объяснить, что я здесь делаю не так?

1 Ответ

0 голосов
/ 09 ноября 2018

Пожалуйста, попробуйте заменить первую смешанную (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.После этого в конечном операторе у нас будет информация о пользователе с информацией о триггере, которая помогает определить, какие действия необходимо предпринять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...