Мульти диспетчеризация или вложенная диспетчеризация - PullRequest
0 голосов
/ 10 марта 2020

У меня есть магазин с двумя полями:

  • items: Item[]
  • money: number

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

  1. pu sh новый элемент в массиве
  2. уменьшение денег

Я не совсем понимаю, что такое хорошая практика при отправке действий ... Какие путь самый лучший?

  1. Multi-диспетчеризация - отправка AddItem действие и DecreaseMoney действие:
store.dispatch([new AddItem(), new DecreaseMoney()]);
Подписаться AddItem действие и рассылка DecreaseMoney действие при первом успешном выполнении:
this.actions$.pipe(ofActionSuccessful(AddItem)).subscribe(() => {store.dispatch(new DecreaseMoney()});
Отправка DecreaseMoney Действие внутри AddItem Действие:
@Action(AddItemAction)
  AddItem({ getState, setState }: StateContext<any>) {
    const state = getState();
    return this.http.post(`${apiUrl}/buy`, {}).pipe(
      tap(newItem => {
        setState({...state, items: [...state.items, newItem]});
        dispatch(new DecreaseMoney()); // <---
      })
    );
  }

1 Ответ

2 голосов
/ 10 марта 2020

если действия не изменяют один и тот же фрагмент состояния, я бы рекомендовал использовать множественную диспетчеризацию, поскольку она менее многословна. Если вы зависите от ответа от вашего первого асинхронного действия c, я думаю, что ваши вложенные настройки логичны. Однако это не похоже на то, что вы передаете что-либо в DecreaseMoney () ... так что первый вариант кажется лучшим.

edit:

Я бы go выбрал вариант 2, а затем это может быть конкретный сценарий c. Если вы добавите все логи c в свое действие, вы соедините DecreaseMoney () с AddItem (). Поместив бизнес-логику c в свой компонент / контейнер, вы можете создавать повторно используемые действия. Это то, что я бы сделал, лично.

...