У меня был случай, когда моя форма входа перестала работать после одной неудачной попытки входа в систему, для выполнения запроса я использовал эффект, и вот как она выглядела до изменений:
@Effect()
login$ = this.actions$.ofType<authActions.Login>(
authActions.LOGIN,
).switchMap(
({ payload: data }) => this.client.login(data),
).map(
({ token }) => new authActions.LoginSuccess(token),
).catch(
(error) => of(new authActions.LoginFailure(error)),
);
Чтобы быть конкретным - когда пользователь пытался войти в систему после неудачной попытки, действие Login было правильно отправлено в магазин, но эффект не был запущен.
Я отчаянно пытался исправить эту ошибку, а затем внес изменение, которое считал бессмысленным:
@Effect()
login$ = this.actions$.ofType<authActions.Login>(
authActions.LOGIN,
).switchMap(
({ payload: data }) => this.client.login(data).map(
({ token }) => new authActions.LoginSuccess(token),
).catch(
(error) => of(new authActions.LoginFailure(error)),
),
);
Но, к счастью, это (ИМО) бессмысленное изменение все устранило. Внезапно эффект успешно запустился после неудачной попытки входа в систему. Может кто-нибудь объяснить мне, что случилось?
спасибо @cartant, не могли бы вы опубликовать ответ, который я мог бы принять?
Конечно. Я могу написать чуть позже - на мобильном банкомате.





Когда ошибка обнаруживается оператором catch (или, в RxJS версии 6, catchError), составленная наблюдаемая продолжается с наблюдаемой разные.
Это означает, что при возникновении ошибки ваш эффект продолжается с наблюдаемой of(new authActions.LoginFailure(error)), которая возвращается в catch.
Продолжение этого наблюдаемого приведет к отправке действия LoginFailure, но после этого наблюдаемое завершится. Это означает, что эффект завершается, и его подписчики автоматически отписываются. Таким образом, эффект перестает отправлять дальнейшие действия.
Более подробно это обсуждается в статье Пола Лессинга Обработка ошибок в эффектах NgRx, и есть правило TSLint - rxjs-no-unsafe-catch - для обнаружения этой конкретной проблемы в моем пакете rxjs-tslint-rules.