我對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