离子4等待异步方法返回

时间:2019-12-23 17:26:21

标签: angular typescript ionic4

我有一个Ionic 4应用程序,可以在其中使用"cloud" service (http).获取用户列表 cloud.getRemoteAccessUsers是一种asynchronous方法,但是我无法在服务中进行编辑。 我想为检查用户创建一个保护措施,我将粘贴一个代码段。

我想让console.log(test)显示一个数组,但只返回ZoneAwarePromise

canActivate(route: ActivatedRouteSnapshot): boolean {
    this.lock = this.cloud.getLocks().find(x => +x.Id === +route.paramMap.get('id'));

    let test = this.cloud.getRemoteAccessUsers(this.lock).then((data) => {
        return data;
    });

    console.log(test);

    return false;
}

2 个答案:

答案 0 :(得分:2)

CanActivate界面也可以返回Promise<boolean>Observable<boolean>

您可以直接返回您的观测值:

canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
    this.lock = this.cloud.getLocks().find(x => +x.Id === +route.paramMap.get('id'));

    return this.cloud.getRemoteAccessUsers(this.lock).then((data) => {
        return data;
    });
}

如果data不是布尔值,则可以在callback中编写逻辑以返回boolean

您当前的测试日志将显示ZoneAwarePromise,因为它是异步调用,因此您记录的是promise,而不是promise返回的值。

如果它是您想要的值,则可以将data记录在.then

return test = this.cloud.getRemoteAccessUsers(this.lock).then((data) => {
    console.log(data)
    return data;
});

您也可以使用async/await

async canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
    this.lock = this.cloud.getLocks().find(x => +x.Id === +route.paramMap.get('id'));

    const test = await this.cloud.getRemoteAccessUsers(this.lock);
    console.log(test);
    return test;
}

答案 1 :(得分:0)

您尝试返回Promise,但不返回数据

如果您想在Promise方法内部解析CanActivate,则将test分配移到then内。

canActivate(route: ActivatedRouteSnapshot): boolean {
        this.lock = this.cloud.getLocks().find(x => +x.Id === +route.paramMap.get('id'));

        this.cloud.getRemoteAccessUsers(this.lock).then((data) => {
           let test = data;
           console.log(test);
        });

        return false;
 }