Зависимость и синхронизация в вызовах Ngrx effect (API)

#ngrx

Вопрос:

Моему компоненту нужны данные из API. Это позволяет магазину отправлять действие, но перед отправкой этого действия сначала необходимо получить некоторые другие данные. Таким образом, отправленное действие зависит от данных, которые необходимо извлечь до того, как будет вызвано фактическое действие и извлеченные данные будут переданы действию.

 this.d1 = this.store.pipe(select(selectData1));
this.d2 = this.store.pipe(select(selectData2));
// ...
// dispatch the actions below to and pass identifier (id) in order to get its object from the API and put the fetched data in store.
this.store.dispatch(action1({data1Id}));
this.store.dispatch(action1({data2Id}));

// dispatch the actual action and pass this.d1 and this.d2
this.store.dispatch(targetAction({this.d1, this.d2}));
 

Какова наилучшая практика для ситуации, описанной выше?

Ответ №1:

Один из способов, которым вы могли бы это сделать, — подписаться на this.d1 this.d2 целевое действие и затем отправить его, когда оно будет отправлено:

 combineLatest([this.d1 this.d2])
  .subscribe(([d1, d2]) => {
    if (d1 amp;amp; d2) {
      this.store.dispatch(targetAction(d1, d2));
    }
  })
 

Однако, возможно, для этого было бы лучше использовать эффект:
https://ngrx.io/guide/effects

Комментарии:

1. Спасибо Стиву, как и я, я использую эффект для извлечения информации (targetAction) из моего API. Но также и эффекты для извлечения d1 и d2. Я нахожу ваше предложение с combineLatest очень логичным. Вы сериализуете действия, и там гарантируется, что действия для извлечения d1 и d2 выполняются до извлечения targetAction. И это происходит только в том случае, если существуют d1 и d2 (защита if).