Добавление takeUntil прекращает запускать все действия rx JS, наблюдаемый при редуксе - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь найти способ отменить все HTTP-запросы после выхода пользователя из системы. Я создал обобщенную функцию c, которая отвечает за создание запроса ajax. Это функция

const createRequest = (ajaxParameters) => {
  return ajax(ajaxParameters).pipe(
    takeUntil([ofType("LOGOUT")])
  )
};

, и все мои функции epi c импортируют вышеуказанную функцию для выполнения HTTP-запроса. Я делаю что-то вроде этого

   const sendRequest = (url) => {
       xhr = createRequest(_.merge({}, requestDefaults, {
             method: "GET",
             url: url
          }, token))
      xhr.pipe(
          map( 
             // some code over here and triggering some actions over here
          )
      )
   }

Проблема заключается в том, что всякий раз, когда я добавляю takeUntil, как способ, который я сделал выше, он перестает вызывать все эпики. Любая идея, что я здесь делаю неправильно?

epi c код

const fetchUserData = action$ => action$.pipe(
  ofType(user.FETCH_USER_DATA.PENDING),
  mergeMap(sendRequest(URL_OVER_HERE))
);

1 Ответ

0 голосов
/ 20 марта 2020

Я не знаю, что там делает [ofType("LOGOUT")], но, скорее всего, вы хотите pipe выключить action$:

const createRequest = (ajaxParameters) => {
  return ajax(ajaxParameters).pipe(
    takeUntil(action$.pipe(ofType("LOGOUT")))
  )
};

takeUntil завершит вашу наблюдаемую, если он получает значение. Как у вас есть, он, вероятно, думает, что массив является наблюдаемым, а значение является оператором ofType. Таким образом, он завершается еще до того, как что-либо начинается Вот почему вы должны слушать action$.

В качестве еще одной оптимизации, вы можете немедленно pipe отключить наблюдаемую xhr:

const sendRequest = (url) => {
  createRequest(_.merge({}, requestDefaults, {
    method: "GET",
    url: url
  }, token))
  .pipe(
    map( 
      // some code over here and triggering some actions over here
    )
  )
}
...