Rest 如何仅在n个HTTP请求的列表已执行并完成后执行HTTP请求

Rest 如何仅在n个HTTP请求的列表已执行并完成后执行HTTP请求,rest,angular,typescript,angular-promise,typescript2.0,Rest,Angular,Typescript,Angular Promise,Typescript2.0,我正在使用Spotify的Web Api 我有一系列的歌曲搜索。对于SongSearchs中的每个songSearch,都会请求搜索这些歌曲,并将其添加到保存曲目spotify ID的歌曲数组中。我一次需要所有这些ID,这样我就可以执行一个POST请求,将所有这些曲目添加到播放列表中。因此,在发出POST请求之前,必须完成所有搜索请求 所有这些都需要在点击按钮时发生 单击按钮时执行的代码: onSubmit(){ while (this.songsService.songSearches.l

我正在使用Spotify的Web Api

我有一系列的歌曲搜索。对于SongSearchs中的每个songSearch,都会请求搜索这些歌曲,并将其添加到保存曲目spotify ID的歌曲数组中。我一次需要所有这些ID,这样我就可以执行一个POST请求,将所有这些曲目添加到播放列表中。因此,在发出POST请求之前,必须完成所有搜索请求

所有这些都需要在点击按钮时发生

单击按钮时执行的代码:

onSubmit(){
  while (this.songsService.songSearches.length){
    this.spotifyserv.searchTrack(this.songsService.songSearches[0]);
    this.songsService.songSearches.shift();
  }
  this.spotifyserv.add_tracks_to_playlist(); //Needs to wait until all requests ^ have been completed
}
搜索跟踪功能:

searchTrack(searchParams: SongSearchParams, type='track'){
  var headers = new Headers({'Authorization': 'Bearer ' + this.hash_params.access_token});
  this.user_url = "https://api.spotify.com/v1/search?query="+searchParams.artist+' '+searchParams.title+"&offset=0&limit=1&type="+type+"&market=US";
  return this.http.get(this.user_url, {headers : headers})
    .subscribe(
      response => {
              var res = response.json();
              var searched_song = {artist : null, title : null, imagePath : null, spotifyID : null}
              searched_song.artist = res.tracks.items[0].artists[0].name;
              searched_song.title = res.tracks.items[0].name;
              searched_song.imagePath = res.tracks.items[0].album.images[0].url;
              searched_song.spotifyID = res.tracks.items[0].id;
              this.songsService.addSong(searched_song);
      }
    );
}
将曲目添加到播放列表功能

add_tracks_to_playlist(){
  var headers = new Headers({'Authorization': 'Bearer ' + this.hash_params.access_token});
  headers.append('Accept', 'application/json');
  this.user_url = "https://api.spotify.com/v1/users/" + this.user_id + "/playlists/" + this.playlist_id + "/tracks"; 
  let songs: Song[] = this.songsService.getSongs(); //playlist_id is hardcoded rn. needs to be added dynamically
  let songIDs : String [] = [];
  for (var i = 0; i < songs.length; i++){
    songIDs.push("spotify:track:" + songs[i].spotifyID);
  }
  let body = {"uris": songIDs};
  this.http
      .post(this.user_url, JSON.stringify(body), {headers : headers})
      .toPromise()
      .then(response => console.log(response))
      .catch(this.handleError);
}
我知道我可能想在某处使用Promise.all,但我不确定如何/在何处使用它

正如您所提到的,Promise.all可以帮助您,如果searchTrack返回Promise。比如说:

searchTrack(searchParams: SongSearchParams, type='track') {
  // ...
  return this.http.get(this.user_url, {headers : headers})
    .toPromise()
    .then(response => {
       // Code from your subscribe
    });
}
并更改onSubmit

onSubmit(){
  const searchPromises: Promise<void>[] = [];
  while (this.songsService.songSearches.length){
    searchPromises.push(this.spotifyserv.searchTrack(this.songsService.songSearches[0]));
    this.songsService.songSearches.shift();
  }
  //Needs to wait until all requests ^ have been completed
  Promise.all(searchPromises)
    .then(() => this.spotifyserv.add_tracks_to_playlist());
}

工作起来很有魅力,我想我现在更了解承诺了。谢谢。听到这个消息我很高兴。正如你肯定注意到的,诀窍在于承诺,然后回报承诺。如果从Promise.then callback返回某个值,则返回的Promise将保留该值作为其结果。然后,您可以在Promise.allresults=>{…}中以数组的形式获得所有结果。谢谢你的澄清。所以本质上是Promise.allSearchPromissions。那么回调只在所有SearchPromissions返回true并确认所有请求都成功后执行?是的,就是这样:-