如何以角度2初始化数据

时间:2017-01-04 21:27:24

标签: angular rxjs

我有一些带有一些属性的服务,这些属性在任何组件加载之前被初始化(它们用作其他http调用的参数)。 Route CanActivate方法用于调用以下方法,该方法应在属性初始化后检索true,否则在出错时检索false。我收到编译错误:声明类型既不是' void'也没有任何'必须返回一个值。我怎么能避免这个错误?

public setupSession(): boolean {

    this._http.get('myservice_url')
    .map (
        (response: Response) => <any>response.json())
        .subscribe (
        data => {
            this.property1 = data.property1;
            this.property2 = data.property2;
            return true;
        },
        err => {
            console.error(err)
            return false;
        }
    )
}

修改: @K。 Daniek感谢您的帮助!我在本文link的帮助下找到了解决方案。现在,我可以确保在任何其他http呼叫之前完成设置。

服务方法:

public setupSession(): Promise<any> {
    var observable = this._http.get('myservice_url')
        .map((response: Response) => {
            var res = response.json();
            return res;
        });

    observable.subscribe(data => {
        this.property1 = data.property1;
        this.property2 = data.property2;
    });

    return observable.toPromise();
}

canActivate方法:

canActivate() {
    return this._sessionService.setupSession().then(() => {
        return true;
    });
}

1 个答案:

答案 0 :(得分:0)

我没有看到将此函数的类型声明为布尔值的观点,特别是当此函数的返回实际上是数据时,而不是布尔值。

请尝试以下代码:

public setupSession() {

  this._http.get('myservice_url')
    .map(
    (response: Response) => <any>response.json())
    .subscribe(
    data => {
        this.property1 = data.property1;
        this.property2 = data.property2;
    },
    err => {
        console.error(err);
    }
    )
}

编辑:我正在测试你的代码并且意识到实际上可以使这个函数工作,但是你必须在subscribe方法之后返回一个布尔值。重构的代码看起来像:

public setupSession(): boolean {

    this._http.get('myservice_url')
        .map(
            (response: Response) => <any>response.json())
        .subscribe(
            data => {
                this.property1 = data.property1;
                this.property2 = data.property2;
            },
            err => {
                console.error(err);
            });
    return true;

}

现在你的http请求函数返回一个布尔值,编译器不会抛出任何错误。

<强> EDIT2

监听,如果您希望此函数为boolean类型,则必须在调用该函数后返回boolean值。由于这个调用是异步的,因此该函数继续执行其他任务,并且不会等待异步响应。这就是为什么函数将始终返回true(在此特定情况下),甚至在返回successerror响应之前。

如果您希望函数在成功时返回true或在出现错误时返回false,请使用以下代码:

public setupSession() {

    this.http.get(`myservice_url`)
        .map(data => data.json())
        .subscribe(data => {
                this.property1 = data.property1;
                this.property2 = data.property2;
                console.log('works');
                return true;
            },
            err => {
                console.error(err);
                console.log('error);
                return false;
            });
}