Angular 2服务:返回局部变量或做出承诺

时间:2017-08-10 13:35:54

标签: javascript angular

我只打一次电话。如果调用已经完成,我需要返回局部变量。

服务:

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,这会引发错误。而且我认为这不是一个好方法,它必须是更好的方式。

2 个答案:

答案 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()