为了寻找可观察到的http序列的帮助,我想对api进行两次http调用,第二次调用依赖于第一次调用。第一个返回一个url数组,第二个为该数组中的每个url发出get请求,然后返回流上的响应。如果我像这样硬编码一个依赖请求,我会得到我要找的一个标题:search(character): Observable<any> {let that = thislet queryUrl: string = character.url;return this.http.get(queryUrl) .map((response: Response) => { this.characterResults = response.json().films return this.characterResults //Example response: // ["https://api.com/films/1", "https://api.com/films/2", "https://api.com/films/3", "https://api.com/films/4"] }) .flatMap((film) => { return that.http.get(film[0]) .map((response: Response) => { return response.json().title }) })}getApiData(character) { this.apiService.search(character) .subscribe((results) => { // on sucesss console.log(results) }, (err: any) => { // on error console.log(err); }, () => { // on completion console.log('complete') } );但是,任何尝试使用FrACH来对该数组进行迭代,然后使所有HTTP调用都给了我这个错误:browser_adapter.js:84 EXCEPTION: TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined理想情况下,我希望有一种优雅的方法,可以在第一次调用的结果数组中并行地进行后续调用,但是我似乎无法确定RXJS的几十个方法中有哪些可以帮助我完成这项工作。有人能帮我吗? 最佳答案 两种方式,如果您希望每个结果都单独流式传输,那么flatMap就是您的朋友。你可以用它来展开任何东西,Arrays、Promises或Observables。在您的情况下,可以通过执行以下操作将请求链接在一起:search(character): Observable<any> { return this.http.get(character.url) .flatMap((response: Response) => response.json().films) .flatMap((film: string) => this.http.get(film), (_, resp) => resp.json().title)}getApiData(character) { this.apiService.search(character) .subscribe((results) => { // on sucesss //Called for each url result console.log(results) }, (err: any) => { // on error console.log(err); }, () => { // on completion console.log('complete') } );或者可以使用forkJoin返回结果数组return this.http.get(character.url) .flatMap((response: response) => //Waits until all the requests are completed before emitting //an array of results Observable.forkJoin(response.json().files.map(film => this.http.get(film).map(resp => resp.json().title) ));编辑1更完整地解决flatMap的第二个参数。这是一个函数,它接收传递给第一选择器方法的原始值,该方法与整平操作的结果配对。也就是说,如果选择器1收到a并返回Observable 。第二个选择器将用参数(a,1),(a,2)和(a,3)调用3次。如果您想获得多个值,我建议您使用辅助映射运算符来保持流的清洁,但这取决于您。.flatMap((film: string) => this.http.get(film), (film: string, resp: Response) => resp.json())//Typescript's destructuring syntax, extracts the values you want//and creates a new object with only those fields.map(({date, title}) => ({date, title}));
10-07 12:18