По вашей идее, нет необходимости выдавать какую-либо ошибку. Вы можете сделать это:
getUserProfile() {
return this.storage.get("userProfile")
.then(user => user || this.getUserProfileWithHttpCall()
);
}
Или await
, async
:
async getUserProfile() {
return (await this.storage.get("userProfile")) || this.getUserProfileWithHttpCall();
}
Может быть, вы захотите использовать Observables
, потому что в наши дни это модно. Вы можете изменить это на это:
getUserProfile() {
return from(this.storage.get("userProfile")).pipe(
concatMap((user) => user ? of(user) : this.getUserProfileWithHttpCall())
);
}
Вы должны изменить свой getUserProfileWithHttpCall, затем:
getUserProfileWithHttpCall(): Observable<UserProfile> {
return this.http.get(`${this.baseUrl}/Account/GetUserInfo`).pipe(
tap((user:UserProfile) => this.storage.set("userProfile", user))
)
}
намного аккуратнее:)
И, наконец, объяснить, почему ваш метод не работает, потому что вы не возвращаете пользователя в then
, когда он не равен нулю, если вы не хотите изменять свой код так «радикально», вы можете также просто сделайте это:
getUserProfile() {
return this.storage.get("userProfile")
.then(user => {
if (user == null) {
throw new Error("no user profile");
}
return user; // you missed this one
}
)
.catch(error => {
//I don't know how to return a different promise
// Like you already did
return this.getUserProfileWithHttpCall();
}
);
}