getUserは非同期関数ですか?解決に時間がかかる場合は? someotherclass
で常に正しい値を返すのでしょうか。
class IdpServer {
constructor() {
this._settings = {
// some identity server settings.
};
this.userManager = new UserManager(this._settings);
this.getUser();
}
async getUser() {
this.user = await this.userManager.getUser();
}
isLoggedIn() {
return this.user != null && !this.user.expired;
}
}
let idpServer = new IdpServer();
export default idpServer;
// another class
// import IdpServer from '...'
class SomeOtherClass {
constructor() {
console.log(IdpServer.isLoggedIn());
}
}
これは このよくある質問 に関連する問題です。
コードが非同期になると、同期的に使用することはできません。 raw promiseの使用が不要な場合は、すべての制御フローをasync
関数で実行する必要があります。
ここでの問題は、getUser
がユーザーデータ自体ではなく、ユーザーデータの約束を提供することです。コンストラクターでpromiseが失われ、これはアンチパターンです。
この問題を解決する1つの方法は、IdpServer
の初期化の約束を提供することですが、APIの残りの部分は同期されます。
class IdpServer {
constructor() {
...
this.initializationPromise = this.getUser();
}
async getUser() {
this.user = await this.userManager.getUser();
}
isLoggedIn() {
return this.user != null && !this.user.expired;
}
}
// inside async function
await idpServer.initializationPromise;
idpServer.isLoggedIn();
アプリケーションの動作に応じて、IdpServer.initializationPromise
はアプリケーションの初期化で処理でき、IdpServer
に依存するすべてのユニットが準備ができるまで初期化されないことを保証します。
もう1つの方法は、IdpServer
を完全に非同期にすることです。
class IdpServer {
constructor() {
...
this.user = this.getUser(); // a promise of user data
}
async getUser() {
return this.userManager.getUser();
}
async isLoggedIn() {
const user = await this.user;
return user != null && !user.expired;
}
}
// inside async function
await idpServer.isLoggedIn();
それに依存するすべてのユニットにも非同期APIがあると予想されます。