在Angular2中,根據第一個API調用的結果實現第二個API調用的正確方法是什麼?我的一個Angular2組件有以下方法。我嘗試了在另一個訂閱完成訂閱,而第二個訂閱的響應總是'未定義'。Angular2在訂閱內訂閱
根據CozyAzure的建議編輯。
export interface Result {
host: string;
resourceUri: string;
groupId?: string;
resource?: any;
}
private curateResults(searchTerm: string, searchResults: SearchResults): Result[] {
const results: Result[] = [];
if (searchResults.results !== undefined && searchResults.results.length > 0) {
searchResults.results.forEach((result: any) => {
const processedSearchResult: Result = {
host: result.origin.toString(),
resourceUri: result.url.toString()
};
processedSearchResult.resource = undefined;
processedSearchResult.groupId = undefined;
this.bopsHttpService.getResourceData(processedSearchResult.host, processedSearchResult.resourceUri)
.flatMap((resource: any) => {
processedSearchResult.groupId = this.getGroupIdFromResource(resource, 'groupId');
if (processedSearchResult.groupId === undefined) {
const uriParts = processedSearchResult.resourceUri.split('/');
const predicate = uriParts[uriParts.length - 2];
if (predicate === 'group') {
processedSearchResult.groupId = uriParts[uriParts.length - 1];
return Observable.empty();
} else {
return this.bopsHttpService.getGroupRelation(processedSearchResult.resourceUri.split('/').pop());
}
} else {
return Observable.empty();
}
})
.subscribe((relation: any) => {
if (relation !== undefined) {
processedSearchResult.groupId = relation.objectId;
console.log('Fetched Group ID: ', processedSearchResult.groupId);
}
});
results.push(processedSearchResult);
});
}
return results;
}
我的HTTP調用如下:
public getGroupRelation(subjectId: string): Observable<Relation> {
const path = `${this.bopsServiceUrl}/relation/${subjectId}/group`;
const queryParameters = new URLSearchParams();
queryParameters.set('at', new Date().toISOString());
const options = new RequestOptions({
headers: this.headers,
search: queryParameters
});
return this.http.get(path, options)
.map((response: Response) => response.json())
.catch((error: any) => Observable.throw(error.json().error
|| 'BOPS Server error during get group relation Operation',
error.json()));
}
public getResourceData(host: string, resourceUri: string): Observable<any> {
const path = host + resourceUri;
const queryParameters = new URLSearchParams();
queryParameters.set('at', new Date().toISOString());
const options = new RequestOptions({
headers: this.headers,
search: queryParameters
});
return this.http.get(path, options)
.map((response: Response) => response.json())
.catch((error: any) => Observable.throw(error
|| 'BOPS Server error during Get Resource Data Operation'));
}
只是澄清,「processedSearchResult.groupId」總是未定義。 – Rama