我对Angular 2和Observable概念非常新颖。然而,我试图实现应该是相当简单的经验大师:)在返回可观察值之前处理数据
因此: 我有一个组件,其中我有subscribed
来自服务的observable。出于测试目的,我一直在使用数据阵列来生成我的组件。现在,当它完成后,我想将真正的API调用挂接到我的服务。现在问题是我从服务器获得的数据在返回到组件之前需要被处理。当我操纵它,我得到错误,如“无法读取属性'订阅零”
现在基本上这个错误来了,因为在我的服务observable,我发送一个API请求使用HTTP.get方法和代码doesn等待它的回应完成。我确实从服务器得到了结果,但是在控制台出现错误之后。
任何人都可以请指导我如何请求HTTP调用,然后在将数据发送到具有订阅服务的组件之前操作其数据?
这里是我的组件代码:
getSearchResults(keyword, parentId?, subCatId?) {
this.subscriptionResults = this.catalogService.getSearchResults(keyword, parentId, subCatId)
.subscribe(
data => {
this.results = data.results.parts;
this.numResults = data.results.totalItemCount;
this.timeResults = data.results.processingTimeMS;
this.categories = data.categories;
this.subCategories = data.subCategories;
this.brands = data.brands;
this.suppliers = data.suppliers;
this.layoutType = data.layoutType;
this.allCategories = data.allCategories;
this.selCategoryName = data.selCategoryName;
this.selSubCategoryName = data.selSubCategoryName;
if (this.debugMode) {
console.log('RESULTS: ', data);
}
},
error => this.errorMessage = <any>error
);
}
这里是我的服务:
// Get data from server
getDataFromServer(URL: string): Observable<any> {
return this.http.get(URL).flatMap(this.extractData).catch(this.handleError);
}
getSearchResults(keyword: string, parentCatId?:number, subCatId?:number): Observable<any> {
let request = null;
let result = null;
let URL = this.API_URL + '/search?categoryId=' + subCatId + '&format=json';
request = this.getDataFromServer(URL);
request.subscribe(
() => {
// Modify result here and send it back
},
error => { console.log('ERROR: ', <any>error); }
);
我要处理的响应数据之前,我想退货。我怎样才能做到这一点?
- 编辑 - 如果我返回BehaviorSubject:
return new BehaviorSubject<any>(request.subscribe(
res => { return this.processResultData(res, layoutType, keyword, parentCatId, subCatId); },
err => { console.log('RETURN ERROR: ', <any>err); }
));
我得到的认购对象在我的组件(这是我不需要)。相反,我需要订阅内的数据。
谢谢! @Alex它可以使用'.map'方法。有趣的是我之前尝试过,但由于某种原因,我得到了一个'undefined'错误。然而有一件事现在不起作用。我得到的数据在相同的组件中正确显示。但是,我发送给其他组件的部分内容会不断显示“正在加载...”我是否需要触发某些事件才能选择新值? (我认为它会自动) – Hassan
澄清 - 我得到一个对象'类别',我传递给子组件显示。它没有检测到变化。我曾尝试使用'async'管道,但这也没有帮助。 – Hassan
啊 - 抱歉没关系。原来我发送的[输入]被复制到'ngOnInit'生命周期钩子中的另一个值,所以更改没有更新。 – Hassan