2017-06-29 223 views
5

在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')); 
    } 
+0

只是澄清,“processedSearchResult.groupId”总是未定义。 – Rama

回答

6

您将需要使用.flatMap()如果你想链中的ObservablesflatMap().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。

+0

谢谢@CozyAzure的建议。不知道我是否按照这个。如果来自第一个API调用的资源没有groupId,我必须进行第二个API调用。 – Rama

+0

@Rama Yeap,我的坏。见编辑 – CozyAzure

+0

不幸的是,这并没有奏效。 processedSearchResult.groupId仍未定义。 – Rama