Должен ли «следующий» всегда вызываться последним в промежуточном программном обеспечении Redux? - PullRequest
0 голосов
/ 15 мая 2018

tl; dr: В функции промежуточного ПО Redux можно ли отправлять новое действие после вызова next для завершения обновления магазина?

Я создаю читатель HackerNews, используя Flutter и built-flutter-redux , основанный на примере TodoMVC Брайана Игана . Он использует HN Firebase-поддерживаемый API для извлечения данных:

https://github.com/HackerNews/API

Мои действия выглядят сейчас так:

ActionDispatcher<Null> fetchHackerNewsTopStories;
ActionDispatcher<List<int>> fetchHackerNewsTopStoriesSuccess;
ActionDispatcher<Null> fetchHackerNewsTopStoriesFailure;
ActionDispatcher<Null> fetchNextHackerNewsItem;
ActionDispatcher<HackerNewsItem> fetchHackerNewsItemSuccess;
ActionDispatcher<Null> fetchHackerNewsItemFailure;

Есть часть промежуточного программного обеспечения, которое прослушивает действие fetchHackerNewsTopStories и запускает вызов API:

MiddlewareHandler<AppState, AppStateBuilder, AppActions, Null>
createFetchHackerNewsTopStories(HackerNewsRepository service) {
  return (MiddlewareApi<AppState, AppStateBuilder, AppActions> api,
      ActionHandler next, Action<Null> action) {
    service.fetchHackerNewsTopStories().then((ids) {
      return api.actions.fetchHackerNewsTopStoriesSuccess(ids);
    }).catchError(api.actions.fetchHackerNewsTopStoriesFailure);

    next(action);
  };
}

Когда он возвращается, я обновляю состояние моего приложения списком идентификаторов.

В какой-то момент мне нужно отправить другое действие, fetchNextHackerNewsItem. Есть еще одна промежуточная функция, которая будет прослушивать это действие и запрашивать детали для первой истории. Когда эти детали поступят, он запросит следующую историю и так далее, пока все не будет обновлено.

Я хотел бы знать, могу ли я сделать это:

// Invoked when REST call for the list of top story IDs completes.
MiddlewareHandler<AppState, AppStateBuilder, AppActions, List<int>>
createFetchHackerNewsTopStoriesSuccess() {
  return (MiddlewareApi<AppState, AppStateBuilder, AppActions> api,
      ActionHandler next, Action<List<int>> action) {
    next(action);
    api.actions.fetchNextHackerNewsItem(); // Is this cool?
  };
} 

// Initiates a request for a single story's details.
MiddlewareHandler<AppState, AppStateBuilder, AppActions, Null>
createFetchNextHackerNewsItem(HackerNewsRepository service) {
  return (MiddlewareApi<AppState, AppStateBuilder, AppActions> api,
      ActionHandler next, Action<Null> action) {
    int nextId = api.state.topStoryIds[api.state.loadedUpToIndex];
    service.fetchHackerNewsItem(nextId).then((item) {
      return api.actions.fetchHackerNewsItemSuccess(item);
    }).catchError(api.actions.fetchHackerNewsTopStoriesFailure);

    next(action);
  };
}

Поскольку createFetchNextHackerNewsItem зависит от состояния приложения (api.state.topStoryIds[api.state.loadedUpToIndex]), я бы хотел, чтобы оно запускалось после , хранилище обновляется с помощью вызова next(action).

Здорово ли отправлять новые действия в промежуточном программном обеспечении Redux после вызова next, или это своего рода анти-паттерн? Если является анти-паттерном, то как лучше всего реализовать этот поток?

1 Ответ

0 голосов
/ 15 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...