将第三方承诺包装到共享的可观察量中



我正在使用 Angular 应用程序中的 AWS Amplify Auth 库来处理身份验证。该库使用Promises公开其方法。

我创建了一个user.service类,它是这些类的包装器,可以将其抽象掉,即:

export class UserService {
isAuthenticated(): Promise<boolean> {
return Auth.currentAuthenticatedUser()
.then(user => {
...
return true;
})
.catch(error => {
...
return false;
});
}
getLanguageCode(): Promise<string> {
return Auth.currentAuthenticatedUser()
.then(user => {
...
});
}
}
getFullName(): Promise<string> {
return Auth.currentAuthenticatedUser()
.then(user => `${user.attributes.given_name} ${user.attributes.family_name}`);
}

这一切都工作正常,但我注意到在启动时,对 AWS Cognito 有多个相同的调用,所有调用都请求/接收相同的数据。我相信这是因为大多数方法(见我上面的例子(都在调用 PromiseAuth.currentAuthenticatedUser()

我的目标是"共享"这个调用,如果已经有一个正在进行的调用,所以它只调用它一次,我认为我可以从承诺创建 Observable 并使用private currentAuthenticatedUser: Observable<any> = from(Auth.currentAuthenticatedUser().pipe(share())共享它,然后在所有函数中引用它,但这对我的一般流程造成了副作用。

有没有办法分享承诺,或者我应该走将其转换为可观察的路线?如果是这样,在类级别上使新的可观察性有意义吗?

谢谢

您可以将 promise 保存为属性,在第一次调用后将解析它,因此下次有人调用它时,它将立即返回 user 对象。

像这样:

export class UserService {
private currentAuthenticatedUserPromise: Promise<User>
constructor() {
this.setPromise();
}
private setPromise() {
this.currentAuthenticatedUserPromise = new Promise((resolve, reject) => {
// Your http call
Auth.currentAuthenticatedUser().then((user) => resolve(user))
});
}
isAuthenticated(forceCheck: Boolean = false): Promise<boolean> {
If (forceCheck) {
this.setPromise();
}
return this.currentAuthenticatedUserPromise
.then(....

最新更新