В redux-observable, как я могу контролировать, реагируют ли редукторы или эпики первыми на действие?

Например. для определенных действий я хочу, чтобы редукторы обрабатывали его раньше, чем это сделают эпики. И наоборот для других действий. Есть ли способ сделать это?


person Leo Jiang    schedule 09.07.2017    source источник
comment
Согласно спецификациям, эпики запускаются после редукторы. Чего вы пытаетесь достичь? Вы хотите, чтобы действие запускалось при изменении данных? Этот ответ дает некоторое представление об этом.   -  person Nikos Paraskevopoulos    schedule 10.07.2017
comment
@NikosParaskevopoulos в эпопее, я отправляю действие, которое создает обещание. Когда обещание выполнено успешно, я хочу отправить другое действие, прежде чем редюсер обработает его. Я делаю это, потому что хочу, чтобы второе действие вело себя по-разному в зависимости от того, как оно было отправлено.   -  person Leo Jiang    schedule 10.07.2017
comment
@LeoJiang хм, до сих пор не ясно, что ты пытаешься сделать. Что вы имеете в виду, говоря, что я хочу отправить другое действие до того, как редуктор обработает его? Может быть, мы лучше поймем, если вы опишете чего вы хотите достичь, а не как вы думаете, что вы должны это сделать? то есть я делаю это, потому что я хочу, чтобы второе действие вело себя по-разному в зависимости от того, как оно было отправлено, это близко, но не говорит, почему. С предоставленной информацией до сих пор все это кажется странным требованием.   -  person jayphelps    schedule 10.07.2017
comment
Есть действие FETCH_USERS, которое создает сетевой запрос. Когда сетевой запрос завершается, отправляется FETCH_USERS_FULFILLED, и редюсер добавляет выбранных пользователей в список пользователей для отображения. Также есть действие FILTER_USERS, которое повторно использует FETCH_USERS для получения списка пользователей, но с применением фильтров. Однако, прежде чем редуктор добавит выбранных пользователей, я хочу очистить список отображаемых пользователей. Таким образом, для фильтрации выбранные пользователи заменяют существующих, а не добавляются к ним. (продолжение)   -  person Leo Jiang    schedule 11.07.2017
comment
Я хочу дождаться успешного выполнения сетевого запроса, прежде чем очищать пользователей, потому что я думаю, что лучше иметь серый список пользователей, чем экран загрузки.   -  person Leo Jiang    schedule 11.07.2017


Ответы (2)



Для любого действия, которое вы хотите, чтобы эпик выполнялся перед редуктором, сделайте 2 действия.

Действие A: Отправьте это в приложении, следите за ним в эпике. Ничего не делайте с ним в редукторе, если это уместно.

Действие B: Отправьте это в Epic, если действие A соответствует правильным условиям. Обращайтесь с этим в редукторе.

person meticoeus    schedule 20.07.2017
comment
Есть ли смысл в том, что это приводит к вещанию магазина, когда для действия А ничего не изменилось? - person fionbio; 21.02.2019
comment
@fionbio Я не уверен, что это всегда имеет смысл, если в редукторе действительно нет изменений. Я думаю, что обычно это делается только ради более простого и согласованного API в приложении. Когда я использую этот шаблон, действие A обычно переключает логический флаг, такой как isLoading: true, тогда эпик отправит действие успеха или неудачи, и каждое из них сбрасывает флаг на false вместе с любыми другими изменениями состояния. - person meticoeus; 22.02.2019
comment
Спасибо. После изучения редукса - я прервал и пошел на Mobx, и теперь я гораздо более счастливый человек. - person fionbio; 22.02.2019