【发布时间】: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 并且需要第一次去获取它们,我就会收到错误。怎么了?
【问题讨论】:
-
您不能从传递给
subscribe的next和error处理程序返回值。这不是它的工作原理。 -
另外,一致的缩进会在某种程度上使这个变得清晰。
-
我不明白你对返回值
next和error的意思。我的错误在哪里?修复了缩进
标签: angular rxjs observable