Angular2 Observable问题,无法读取未定义的属性'subscribe'

时间:2017-08-05 09:42:04

标签: angular rxjs observable

我在Angular2中遇到了Observables的问题,这在第一次调用代码时总会导致“无法读取未定义的属性'subscribe'。

我有一个名为FieldService的服务,它是一个getFields方法:

getFields(): Observable<any>{

    console.log("FieldService getFields");

    let fields = JSON.parse(localStorage.getItem('organisationFields') || 'null');

    if(!fields) {
       this._backendService.get(this.fieldsUrl).subscribe(response=> {
       let fields = response.data;

       console.log("FieldService no local fields");

       localStorage.setItem('organisationFields', JSON.stringify(fields));

       return Observable.of(fields).map(o => o);
    }, error => { 
        console.error('FieldsService An error occurred', error);
            return Observable.throw(error);
        }); 
    } else {
       console.log("FieldService local fields") 
        return Observable.of(fields).map(o => o);
    }
}

检查本地存储中是否有“字段”并将其作为Observable返回,如果没有(第一次登录),我们从后端获取这些字段并将它们存储在localStorage上。 / p>

此服务在ngOnInit中的ListComponent.ts中使用:

this.fieldService.getFields().subscribe( (response) => {
    let fields = response;  
    this.fieldObjects = {};
    for(let fieldIndex of fields){
        this.fieldObjects[fieldIndex.id] = fieldIndex;
    }
   this.getDeviations(this.page, this.config.stage.id, this.config.createdBy);
}, error => { 
    console.error('An error occurred', error);
});

我需要在调用getDeviations()之前调用getFields()方法,但是我收到此错误:

ERROR TypeError: Cannot read property 'subscribe' of undefined
    at ListComponent.webpackJsonp.../../../../../src/app/deviation/list.component.ts.ListComponent.ngOnInit (list.component.ts:38)

如果localStorage中存在“fields” - 代码每次都有效,但如果我清除localStorage并且第一次需要去获取它们,我就会收到错误。有什么问题?

2 个答案:

答案 0 :(得分:1)

试试这个

getFields(): Observable<any>{

    console.log("FieldService getFields");

    let fields = JSON.parse(localStorage.getItem('organisationFields') || 'null');

    if(!fields) {
        return this._backendService.get(this.fieldsUrl)
                                    .map(response=> {
                                                let fields = response.data;
                                                console.log("FieldService no local fields");
                                                localStorage.setItem('organisationFields', JSON.stringify(fields));
                                                return fields;
                                            }); 
    } else {
       console.log("FieldService local fields") 
        return Observable.of(fields).map(o => o);
    }
}

关于if,你实际上没有回复任何东西,那就是你未定义的原因。

答案 1 :(得分:0)

试试这个

只需导入此组件,即可解决您的问题。

import 'rxjs/add/observable/of';