Кто должен подписаться на асинхронное действие NGXS - вызывающий диспетчер или обработчик @Action? - PullRequest
0 голосов
/ 26 сентября 2019

Я не знаю, является ли это только вопросом стиля.Существует как минимум 2 способа обработки асинхронных действий:

подписка после dispatch

// action is being dispatched and subscribed
this.store.dispatch(new LoadCustomer(customerId)).subscribe(); // <-- subscribe

В состоянии:

@Action(LoadCustomer)
loadCustomer(context: StateContext<CustomerStateModel>,
             customerId: string) {
  return this.customerService.loadById(customerId).pipe(
    tap(c => context.setState(produce(context.getState(), draft => {
      draft.byId[customerId] = c;
    })))
  ); // <-- NO subscribe here, just return the Observable
}

подписка в обработчике @Action

// action is being dispatched
this.store.dispatch(new LoadCustomer(customerId)); // <-- no subscribe

В штате:

@Action(LoadCustomer)
loadCustomer(context: StateContext<CustomerStateModel>,
             customerId: string) {
  this.customerService.loadById(customerId).pipe(
    tap(c => context.setState(produce(context.getState(), draft => {
      draft.byId[customerId] = c;
    })))
  ).subscribe(); // <-- subscribe is done in action handler
}

Вопрос

Какой из них лучше и почему?

Редактировать / Подсказка

Оказалось, что основной проблемой, которая привела к этому вопросу, было следующее: у нас был HttpInterceptor, кеширующий «слишком много», который выглядел как понравившийся, если некоторые действия не были выполнены.На самом деле подписка уже правильно обрабатывается NGXS, но в нашем случае никакого эффекта не было видно (нет запроса на вкладке сети).

В наших случаях вызовы .subscribe() могут быть исключены.Только там, где нам нужно дождаться окончания действия, подписка после отправки имеет смысл.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Я думаю, что это в некоторой степени вопрос стиля, но я бы сказал (из-за моего использования NGXS), это наиболее типично:

При рассылке сделайте это, и подпишитесь только здесь, если есть какие-то пост-действие, которое вы хотите выполнить.

this.store.dispatch(new LoadCustomer(customerId));

И в состоянии, вариант 1 подходит, чтобы вернуть Observable в инфраструктуру NGXS и позволить ей обрабатывать саму подписку (см.из документов re: обработка действий).

0 голосов
/ 26 сентября 2019

Подход номер один, так как будет только одна подписка, и исходный компонент / служба сможет реагировать на нее.Подписка в @Action означает, что всякий раз, когда вызывается обработанный @Action, создается новая подписка.

...