javascript - 使用 Angular 和 Rxjs 处理多个 HTTP 请求并返回结果

标签 javascript angular typescript rxjs spotify

我目前面临着发送 GET 请求的一堆 url [50 of em] 到 spotify 服务器,然后将它们的结果返回到单个 Observable/array/object 中的挑战。

我想出的当前代码:

curatedTopArtistTracks(artistIds) {
    let responseStore = [];
    for (let [index, artistId] of artistIds.entries()) {

      let baseURL = `https://api.spotify.com/v1/artists/${artistId}/top-tracks?country=US`;

      let response = this.http.get<any>(baseURL, { headers: this.customHeaders });

      response.subscribe(
        res => {
          responseStore.push(res.tracks);
        },
        error => {
          console.log('ERROR IN GETTING RESPONSE : INDEX : ', index);
        }
      );
    }
return responseStore;
  }

网址是:https://api.spotify.com/v1/artists/${artistId}/top-tracks?country=US其中 ${artistId}是动态的,有 50 个 artistId .

我的理解

虽然该函数帮助我发送适当的请求并且我得到了 200 ok 响应,但明显的问题是 for 循环不会等到 HTTP 请求得到解决并返回未定义的 responseStore .

我已经了解了 ForkJoin and mergemap in Rxjs 的一些概念并提出了以下代码:

例如:

  curatedTopArtistTracks(artistIds): Observable<any> {
    let responseStore = [];
    for (let [index, artistId] of artistIds.entries()) {
      let baseURL = `https://api.spotify.com/v1/artists/${artistId}/top-tracks?country=US`;
      const requestURL = this.http.get(baseURL);
      responseStore.push(requestURL);
    }
    return forkJoin(responseStore);
  }

但是,上面的代码甚至没有开始获取响应,因为我猜是因为我将 url 插入数组并且 forkjoin 无法识别它。

任何关于如何实现上述目标的见解都会有所帮助!

更新

正如@martin 在下面的评论中提到的,我没有订阅该服务,但订阅后它运行良好。

如下:

let response = this.service.curatedTopArtistTracks(artistArray).subscribe(
      res => {
        console.log('RESPONSE : ', res);
      },
      error => {
        console.log('error : ', error);
      }
    )

最佳答案

像这样尝试:

return request1().pipe(
  mergeMap(res1=> request2(res1.id).pipe(
    map(res2=> {
      return {
        res1: res1,
        res2: res2
      }
    })
  ))
)

关于javascript - 使用 Angular 和 Rxjs 处理多个 HTTP 请求并返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59591900/

相关文章:

javascript - 将同一数组上的两个元素相乘后减去数组的一个元素

angular - 没有 UrlHelperService 的提供者

typescript - IE11 Angular-CLI 源映射不工作

javascript - 使用 Reactjs 在 Canvas 上绘制图像后无法将 Canvas 转换为图像

javascript - JQuery/Django 有办法构建 "click the text to edit"吗?

javascript - 如何获取表单的属性?

android - 如何将 Ionic 设置为默认呈现 iOS 样式?

javascript - 错误: export 'Draw' (imported as 'L' ) was not found in 'leaflet'

typescript - 强制 IDE 使用 Webpack 解析 Typescript 模块的别名

javascript - dayjs() 的时区错误