当 map 中有另一个请求时,RxJs 处理错误
RxJs Handle error when there is another request inside map
我有登录服务,使用方式如下:
// LoginComponent
this.authService.loginDb(credentials)
.subscribe(() => {
this.router.navigate(['/dashboard']);
},
(error) => {
this.errorMessage = error.description
});
//auth.service
public loginDb(credentials: Credentials): Observable <any> {
//make call to third party API
return this.auth0.client.login({
...
})
.map((resp) => {
// here decode token and then make another request to my server for saving user
this.token = <Token> this.jwtHelper.decodeToken(resp.idToken);
return this.userService.createOrUpdateUser(this.token)
.subscribe(() => {
this.localStorageService.set('token', resp.idToken);
this.localStorageService.set('decoded_token', this.token);
this.loggedIn = true;
})
})
}
问题是,例如我的服务器出现错误,this.userService.createOrUpdateUser
失败,然后 error
将无法在 LoginComponent
中处理此问题。所以,我也希望 error
处理内部请求。此外,我看到 subscribe
在第二个请求完成之前被调用。
我相信在 rxjs 中有一些运算符可以做到这一点,但我找不到它。
如果您将 map()
替换为 concatMap()
,它将等待其内部 Observable 完成。此外,如果内部 Observable 发出错误,它将沿着链传播。
通常尽量避免嵌套 subscribe()
调用。
public loginDb(credentials: Credentials): Observable <any> {
//make call to third party API
return this.auth0.client.login({
...
})
.do(resp => {
this.localStorageService.set('token', resp.idToken);
this.localStorageService.set('decoded_token', this.token);
})
.concatMap((resp) => {
// here decode token and then make another request to my server for saving user
this.token = <Token> this.jwtHelper.decodeToken(resp.idToken);
return this.userService.createOrUpdateUser(this.token);
})
.do(() => {
this.loggedIn = true;
});
}
A 使用两个 do()
来执行一些副作用,但也许在您的特定用例中您不需要它们或以不同的方式使用它们。
我有登录服务,使用方式如下:
// LoginComponent
this.authService.loginDb(credentials)
.subscribe(() => {
this.router.navigate(['/dashboard']);
},
(error) => {
this.errorMessage = error.description
});
//auth.service
public loginDb(credentials: Credentials): Observable <any> {
//make call to third party API
return this.auth0.client.login({
...
})
.map((resp) => {
// here decode token and then make another request to my server for saving user
this.token = <Token> this.jwtHelper.decodeToken(resp.idToken);
return this.userService.createOrUpdateUser(this.token)
.subscribe(() => {
this.localStorageService.set('token', resp.idToken);
this.localStorageService.set('decoded_token', this.token);
this.loggedIn = true;
})
})
}
问题是,例如我的服务器出现错误,this.userService.createOrUpdateUser
失败,然后 error
将无法在 LoginComponent
中处理此问题。所以,我也希望 error
处理内部请求。此外,我看到 subscribe
在第二个请求完成之前被调用。
我相信在 rxjs 中有一些运算符可以做到这一点,但我找不到它。
如果您将 map()
替换为 concatMap()
,它将等待其内部 Observable 完成。此外,如果内部 Observable 发出错误,它将沿着链传播。
通常尽量避免嵌套 subscribe()
调用。
public loginDb(credentials: Credentials): Observable <any> {
//make call to third party API
return this.auth0.client.login({
...
})
.do(resp => {
this.localStorageService.set('token', resp.idToken);
this.localStorageService.set('decoded_token', this.token);
})
.concatMap((resp) => {
// here decode token and then make another request to my server for saving user
this.token = <Token> this.jwtHelper.decodeToken(resp.idToken);
return this.userService.createOrUpdateUser(this.token);
})
.do(() => {
this.loggedIn = true;
});
}
A 使用两个 do()
来执行一些副作用,但也许在您的特定用例中您不需要它们或以不同的方式使用它们。