我在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上。
我在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并需要首次获取它们,则会收到错误消息。怎么了?
试试这个
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上,您实际上没有返回任何东西,这就是为什么您变得不确定的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句