Rxjs, как получить доступ к предыдущему параметру с помощью withlatestfrom

Использование RxJs 6

Вот отрывок из канала RxJs:

.pipe(
  tap((action) => console.log(action)),
  // error is on following line
  withLatestFrom(this.store.pipe(select(selectBim(action.payload)))),
  ...
)

Ошибка в моей IDE - Cannot find name 'action', а ошибка времени выполнения - action is not defined.

Но в withLatestFrom мне нужен доступ к action. Как я могу это сделать? Спасибо

Почему бы не использовать flatMap вместо withLatestFrom?

Martin Adámek 10.08.2018 14:32

не могли бы вы привести пример, как плз

danday74 10.08.2018 14:32
1
2
1 549
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вы могли бы просто использовать вместо этого оператор flatMap (псевдоним для mergeMap):

.pipe(
  flatMap((action) => this.store.pipe(select(selectSim(action.payload)))),
  tap((action) => console.log(action)),
  ...
)

Это должно напечатать значение второй наблюдаемой (из вашего store). Если вам нужны оба, вы можете использовать forkJoin или switchMap, или просто сохранить значение action в какой-либо переменной с внешней областью.

switchMap с forkJoin внутри сделал это - большое спасибо - также работает подход переменных с внешней областью видимости

danday74 10.08.2018 23:54

Для записи вот что сработало:

mergeMap((action) => forkJoin(
  of(action),
  this.store.pipe(select(selectBim(action.payload))).take(1),
  this.store.pipe(select(selectCurrentBim)).take(1)
)),
map(([action, requestedBim, currentBim]) => ({requestedBimId: action.payload, requestedBim, currentBim})),

Теперь у меня есть доступ ко всем данным в операторе карты после mergeMap.

withLatestFrom намного более лаконичен, если вам не нужен доступ к action в параметрах, заданных для withLatestFrom.

это будет работать, но обычно это антипаттерн в ngrx. Полезные данные действия должны содержать всю информацию, необходимую для изменения состояния. Необходимость доступа к самому состоянию для дальнейшего изменения состояния почти всегда является плохим / сложным в обслуживании подходом.

bryan60 11.08.2018 18:11

Меня учили использовать withLatestFrom и использовать селекторы ngrx в параметрах withLatestFrom - этому учат в курсе NgRx 6 Udemy - однако, используя то, что меня учили, я столкнулся с необходимостью доступа к действию в параметрах withLatestFrom - и это почему меня погнали по этому пути - не могли бы вы указать на статью, чтобы подтвердить то, что вы говорите - большое спасибо - люблю конструктивные отзывы

danday74 11.08.2018 18:19

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