Жду асинхронной отправки действия в редукс-наблюдаемой - PullRequest
0 голосов
/ 26 августа 2018

У меня есть эпос, который отправляет действие, которое обрабатывается промежуточным программным обеспечением-редуктором, которое возвращает обещание после отправки действия. Эпопея выглядит примерно так:

const myEpic = action$ =>
  action$.pipe(
    ofType(SAVE_ACTION),
    switchMap(action => [
      saveData(action.payload)
    ])
) 

Когда отправляется SAVE_ACTION, он попадает в эпопею, которая отправляет действие, созданное создателем действия saveAction.

Это результирующее действие перехватывается промежуточным программным обеспечением redux (в частности, redux-axios-middleware), которое выполняет HTTP-запрос и преобразует результат отправки такого действия в обещание со стандартным поведением разрешения. когда HTTP-запрос завершается успешно и отклоняется при сбое HTTP-запроса.

Что мне нужно сделать, так это выполнить дополнительную работу после того, как обещание будет выполнено, в рамках этого эпоса, потому что мне нужны данные, содержащиеся как в полезной нагрузке начального действия SAVE_ACTION, так и в полезной нагрузке ответа HTTP.

Поскольку промежуточное программное обеспечение также отправляет действия после завершения основного HTTP-запроса, было бы легко написать дополнительную эпопею для выполнения дополнительной работы, которую мне нужно выполнить в отдельной эпопее, но у меня не было бы доступа к полезной нагрузке. из первоначального SAVE_ACTION больше, поэтому я пытаюсь выяснить, можно ли все это обработать в рамках одного эпоса, и я до сих пор не нашел выхода. Я нашел в Интернете посты, такие как , этот , который очень информативен, но все еще не решает проблему ожидания действия, а не просто заметен.

1 Ответ

0 голосов
/ 27 августа 2018

Один из подходов заключается в использовании слияния следующим образом:

 import { merge } from 'rxjs/observable/merge';

 const myEpic = action$ => {
     let initialPayload = null;      

     return merge(
         action$.pipe(
             ofType(SAVE_ACTION),
             switchMap(action => {
                 initialPayload = action.payload;

                 return [saveData(action.payload)]
             })
         ),

         action$.pipe(
             ofType(SAVE_ACTION_SUCCESS),
             mergeMap(action => {
                 // Use initialPayload here.
             })
         ),
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...