我只打一次电话。如果调用已经完成,我需要返回局部变量。
服务:
public currentUser: User;
getUser() {
if (this.currentUser) {
return this.currentUser;
}
else {
return this.http.get('/api/user/')
.toPromise()
.then(response => {
this.currentUser = response.json() as User;
return this.currentUser;
});
}
}
如果用户为null,则调用已完成但未在组件中检索,因为调用是异步的。我怎样才能做到这一点?
我在组件中尝试了这个:
getUserFromService() {
let serviceReturn = this.userService.getUser();
if (serviceReturn instanceof User) {
this.user = serviceReturn;
}
else {
let promise = serviceReturn as Promise<User>;
promise.then(
response => {
this.user = response;
}
);
}
}
它是第一次工作,但第二次,它不会将serviceReturn识别为用户并转到else
,这会引发错误。而且我认为这不是一个好方法,它必须是更好的方式。
答案 0 :(得分:2)
但是,您将获得两种不同的返回类型,Promise<User>
和User
。然后,您的服务消费者将始终确保他们正在接收哪一个。最好的是始终返回Promise
:
private currentUser: Promise<User>;
getUser() {
if (!this.currentUser) {
this.currentUser = this.http
.get('/api/user/')
.map(r => r.json())
.toPromise();
}
return this.currentUser;
}
现在所有消费者都必须这样做:
async doSomething(): Promise<any> {
let user: User = await this.userService.getUser();
}
请注意,如果您在方法前添加async
关键字,始终会返回Promise
。此Promise
包含您在此方法中返回的任何内容。如果您不想使用它,您可以像这样,但代码的可读性会降低:
doSomething(): any {
this.userService.getUser().then((user: User) => {
});
}
答案 1 :(得分:0)
稍微使用async/await
内容之后,我认为在服务中使用async/await
并将currentUser作为实际User
代替{{}也可以。 1}}:
Promise<User>
方法private currentUser: User;
async getUser() {
if (!this.currentUser) {
this.currentUser = await this.http
.get('/api/user/')
.map(r => r.json());
}
return this.currentUser;
}
现在总是返回getUser()
我认为,这种代码的可读性更好一些。显然,缺点是在服务中,您应该直接使用Promise<User>
而不是getUser()
。