Angular2在订阅内订阅
问题描述:
在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'));
}
答
您将需要使用.flatMap()
如果你想链中的Observables
。 flatMap()
与.then()
相同如果您正在考虑Promise
的方式。
而是执行此操作:
this.bopsHttpService.getResourceData(processedSearchResult.host, processedSearchResult.resourceUri)
.flatMap(() => {
//check if groupId exist, or whatever your logic is
if(hasGroupId){
//groupId exist, proceed to call your second request
return this.bopsHttpService.getGroupRelation(processedSearchResult.resourceUri.split('/').pop());
}
//groupId doesn't exist, return an empty Observable.
return Observable.empty();
})
.subscribe((relation) => {
if (relation !== undefined) {
processedSearchResult.groupId = relation.objectId;
console.log('Fetched Group ID: ', processedSearchResult.groupId);
}
})
编辑:
你可以做你flatMap()
回调内部的任何干预。您可以检查groupId
是否存在,只有您继续进行下一个电话。如果不是,只需使用Obersvable.empty()
返回一个空的Observable。
只是澄清,“processedSearchResult.groupId”总是未定义。 – Rama