@angular @ ngrx / effects HTTP-запрос продолжает отмену и повторную попытку

У меня есть очень простой эффект, который делает HTTP-запрос и отправляет действие, когда оно завершено.

HTTP-запрос постоянно отменяется и переделывается снова и снова.

введите здесь описание изображения

Первоначально я думал, что причиной проблемы является switchMap (отмена наблюдаемого), поэтому я попытался использовать mergeMap (тот же результат).

Ниже мой код для эффекта.

signIn$ = this.actions$
  .ofType(ACTIONS.AUTH.SIGN_IN)
  .map(toPayload)
  .map(payload => toInput(payload))
  .switchMap(input => this.http
      .post<Output>(`${GLOBALS.endpoint}/auth/authenticate`, input)
      .map(output => ({ type: ACTIONS.APP.PUSH_NOTIFICATION, payload: "test" }))
      .catch(error => of(createAction(ACTIONS.APP.LOG_EXCEPTION, error)))
  );

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

Не знаю, имеет ли это значение, но я использую HttpClient (@ angular / common / http), а не @ angular / http.

Любой совет будет очень признателен!


person spyter    schedule 31.07.2017    source источник
comment
Проблема здесь в том, что я написал ng HTTP-перехватчик. Я привязался к своему наблюдаемому хранилищу, чтобы получить его состояние для пользовательских заголовков HTTP. Была проблема в способе привязки к этому наблюдаемому, из-за которого HTTP-запросы отправлялись несколько раз с обновлениями магазина (вызванными эффектами). Ошибки вообще не было в коде эффектов. Для будущих читателей этого поста :)   -  person spyter    schedule 31.07.2017


Ответы (2)


"switchMap" имеет собственный механизм "отказа от подписки", который отменяет запросы api,

использование "flatMap" (или mergeMap) вместо этого должно сработать для вас.

person itay oded    schedule 03.01.2018

Похоже, вы отправляете один и тот же запрос несколько раз за короткий промежуток времени. Постарайтесь ограничить запрос только при изменении токена. Ниже может работать:

signIn$ = this.actions$
  .ofType(ACTIONS.AUTH.SIGN_IN)
  .distinctUntilChanged()
  .map(payload => toInput(payload))
  .switchMap(input => this.http
      .post<Output>(`${GLOBALS.endpoint}/auth/authenticate`, input)
      .map(output => ({ type: ACTIONS.APP.PUSH_NOTIFICATION, payload: "test" }))
      .catch(error => of(createAction(ACTIONS.APP.LOG_EXCEPTION, error)))
  );
person jcroll    schedule 31.07.2017
comment
Спасибо за вклад! Я пробовал это, и у меня все еще та же проблема. Если я использую .do (console.log) вместо отдельногоUntilChanged (), он срабатывает только один раз (если это помогает). Часть, которая, кажется, срабатывает несколько раз, - это .switchMap. Любые журналы .do ниже или после этого будут срабатывать повторно. - person spyter; 31.07.2017
comment
Попробуйте distinctUntilKeyChanged('email') или что-то в этом роде - person jcroll; 31.07.2017