问题描述
在Angular2中,根据第一个API调用的结果来实现第二个API调用的正确方法是什么?我的Angular2组件之一具有以下方法.我尝试将一个订阅放在另一个订阅中完成,而第二个订阅的响应始终为未定义".
In Angular2, what would be the correct way to implement a second API call based on the result from the first API call? One of my Angular2 components has the following method. I tried with having a subscribe inside another subscribe on complete and the response from the second subscribe is always 'undefined'.
根据CozyAzure的建议进行编辑.
Edit based on suggestion from 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调用如下:
My http calls are as follows:
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'));
}
推荐答案
如果要链接Observables
,则需要使用.flatMap()
.如果您想到的是Promise
方式,则flatMap()
与.then()
相同.
You will need to use .flatMap()
if you want to chain your Observables
. flatMap()
is the same as .then()
if you are thinking of the Promise
way.
相反,请执行以下操作:
Do this instead:
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.
You can do any interventions inside your flatMap()
callbacks. You can check if the groupId
exist or not, only then you proceed to your next call. If it doesn't, simply returns an empty Observable using Obersvable.empty()
.
这篇关于Angular2内部订阅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!