Я не знаю, является ли это только вопросом стиля.Существует как минимум 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()
могут быть исключены.Только там, где нам нужно дождаться окончания действия, подписка после отправки имеет смысл.