У меня возникла проблема с описанным ниже методом (onTrySignin
), когда я столкнулся с ответом об ошибке HTTP
. Блок catch
сразу после моего вызова HTTP
не позволяет Side Effect
выдавать ошибку Action
. если я делаю console.log
, я получаю эту ошибку.
TypeError: вы указали «undefined» там, где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable.
как я могу сохранить поток Observable
и передать ответ следующему блоку (mergeMap
), где я могу запустить другие Actions
, (FailedSignin()
) в этом случае?
onTrySignin = this.actions$
.ofType(AuthActions.TRY_SIGNIN)
.map((action: AuthActions.TrySignin) => {
return action.payload;
})
.switchMap((action: DispatchAction) => {
const trySignInPayload: TrySignInPayload = action.payload;
return this.httpService.postRequest('Account/Login', (trySignInPayload.loginData))
.catch((error: any) => {
console.log(error)
return Observable.empty();
})
.mergeMap((response: HttpResponse<any>) => {
switch (response.status) {
case 200:
if (trySignInPayload.returnUrl) {
this.router.navigate([trySignInPayload.returnUrl]);
} else {
this.router.navigate(['/dbapp']);
}
return Observable.concat(
Observable.of(new AuthActions.GenerateAntiforgeryToken()),
Observable.of(new AuthActions.Signin(fromAuth.authId, this.fetchUserData()))
);
case 401:
case 404:
return Observable.concat(
Observable.of(new AuthActions.FailedSignin()),
Observable.empty()
);
default:
return Observable.concat(
Observable.of(new AuthActions.FailedSignin()),
Observable.empty()
);
}
})
}).catch((error) => {
return Observable.throw(error);
});
Это мой httpService
public postRequest(apiUrl: string, jsonData: {} = {}): Observable<any> {
return this.httpService.post(this.baseUrl + apiUrl, JSON.stringify(jsonData),
{observe: 'response', reportProgress: true, withCredentials: true});
}