如何解决从被拒绝的承诺中观察到的回报
我正在尝试确定如何/是否可以将Promise拒绝转换为类型化的Observable。
我有一个具有这样功能的登录组件...
login() {
const login$ = this.authenticationService.login(this.loginForm.value)
login$
.pipe(
finalize(() => {
this.loginForm.markAsPristine();
this.isLoading = false;
}),untilDestroyed(this)
)
.subscribe(
(credentials) => {
log.debug(`${credentials.username} successfully logged in`);
this.router.navigate([this.route.snapshot.queryParams.redirect || '/'],{ replaceUrl: true });
},(error) => {
log.debug(`Login error: ${error}`);
this.error = error;
}
)
}
以及使用这种方法的身份验证服务...
login(context: LoginContext): Observable<Credentials> {
var data = {} as Credentials
// Call a method that returns a Promise
this.server.authenticate(LoginContext)
.then((result) -> {
data.username = result.user.username
data.token = result.accessToken
this.credentialsService.setCredentials(data,context.remember)
// Not sure what to do here...need to return data somehow as an Observable
// return data
})
.catch((err) => {
// Not sure what to do here either...need to bubble the err up so that it's caught in subscribe
// return throwError(err)
})
}
如果Promise解决了,如何返回Observable<Credentials>
,如果拒绝则冒出错误?
我知道,如果我将身份验证服务功能更改为返回Promise<Observable<Credentials>>
,就可以使所有工作正常,但是为了学习新事物,我试图弄清楚这是否可行。 / p>
解决方法
您可以使用from
function将任何Promise
转换为Observable
:
import { from } from 'rxjs';
// ...
class YourClass {
login(context: LoginContext): Observable<Credentials> {
return from(this.server.authenticate(LoginContext).then(result => {
const credentials: Credentials = {
username: result.user.username,token: result.accessToken
};
this.credentialsService.setCredentials(credentials,context.remember);
return credentials;
}));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。