【问题标题】:Angular2 Observable issue, Cannot read property 'subscribe' of undefinedAngular2 Observable 问题,无法读取未定义的属性“订阅”
【发布时间】:2018-01-13 04:45:54
【问题描述】:

Angular2 中的 Observables 有问题,第一次调用代码时总是导致“无法读取未定义的属性‘订阅’”。

我有一个名为 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 中。

此服务在我的 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);
});

我需要先调用 getFields() 方法,然后才能调用 getDeviations(),但我收到此错误:

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

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

【问题讨论】:

  • 您不能从传递给subscribenexterror 处理程序返回值。这不是它的工作原理。
  • 另外,一致的缩进会在某种程度上使这个变得清晰。
  • 我不明白你对返回值nexterror 的意思。我的错误在哪里?修复了缩进

标签: angular rxjs observable


【解决方案1】:

试试这个

只需导入这个组件,可能会解决您的问题。

import 'rxjs/add/observable/of';

【讨论】:

    【解决方案2】:

    试试这个

    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 中,你实际上并没有返回任何东西,这就是你得到 undefined 的原因。

    【讨论】:

    • 谢谢安德烈,就是这样。我忘记了this._backendService前面的return,我还将subscribe更改为map
    • 不客气。如果有帮助,请接受我的回答。
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2018-07-22
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多