2016-04-05 11 views
1

RESTfulサービスを複数コールしています。それぞれの呼び出しは私に結果を得ます。たとえば、次のようなオブジェクトを返します。複数のObservableを結合し、すべての結果を1つのサブスクライブで取得する方法

{ 
    results: { 
      name: "Joe", 
      age: 10,  
    } 
} 

私は別のリクエストパラメータを持つサービスへの5種類のコールを作っています、と私は唯一、すべての5つの呼び出しが完了したとき、私のプログラムに結果を返すようにしたいとオブジェクトを返しました。私は上記のような5つのオブジェクトの配列でアプリケーションに戻りたいと思います。

Observablesで角度2でどのように行うことができますか?

これは私がちょうど早く試してみましたが、それは動作しませんなぜ私が理解することはできませんものです。

getImage(imageUrl: string) { 

     console.log("Fetching from " + imageUrl); 

     return Observable.create((o) => { 
      this.httpService.get(imageUrl) 
      .map(res => { 
       return res.json(); 
      }) 
      .map(res => res.photos.photo[0]) 
      .subscribe((result) => { 
       console.log(this.generateImageUrl(result)); 
       o.next(this.generateImageUrl(result)); 
      }); 
     }); 
    } 

    getImages(hashtags:string[]){ 
     var arrayOfObservables = []; 
     for (var hashtag in hashtags){ 
      var url = this.flickrAPI.fetchImagesByTag + hashtags[hashtag]; 
      var query = this.getImage(url); 
      arrayOfObservables.push(query); 
     } 
     console.log(arrayOfObservables); 
     return Observable.forkJoin(arrayOfObservables, function(){ 
      console.log("Fork Join Done"); 
      return "from Fork Join with love"; 
     }); 
    } 

そして、サブスクリプションの一部がここで実際に

onSubmit() { 
     // First, clear FeedItems 
     this.feedItems = []; 

     var tweets$ = this.twitterService.getTweets(this.hashtagInput); 

     tweets$.subscribe((tweets) => { 
      for (var i in tweets) { 
       var hashtags = tweets[i].entities.hashtags; 
       var flicks$ = this.flickrService.getImages(hashtags); 
       this.subscribeToFlicks(flicks$, tweets[i]); 
      } 
     }); 
    } 


    subscribeToFlicks(flicks$, tweet) { 
     console.log("Here"); 
     flicks$.subscribe((results) => { 
      console.log("Flickr Subscription:"); 
      console.log(results); 

      var twitterItem = new TwitterData(tweet.user, tweet.text); 
      var flickrItem = new FlickrData("null", results); 

      var feedItem = new FeedItem(twitterItem, flickrItem); 

      this.feedItems.push(feedItem); 
     }); 
    } 
+1

whate "それはうまくいかない"という意味ですか?代わりにそれは何ですか? – drewmoore

+0

@byが動作していない、何も起こっていないことを意味する – CodyBugstein

答えて

2

起こる、あなたが必要

getImages(hashtags:string[]){ 
    var arrayOfObservables = []; 
    for (var hashtag in hashtags){ 
     var url = this.flickrAPI.fetchImagesByTag + hashtags[hashtag]; 
     var query = this.getImage(url); 
     arrayOfObservables.push(query); 
    } 
    console.log(arrayOfObservables); 
    return Observable.forkJoin(arrayOfObservables); 
} 

第2パラメータを削除するには、次のように入力します。 eterはresultSelectorに対応します。すべてのイベントを受け取ったときにforkJoinによって返された結果を作成することができます(望むならば)。指定されていない場合、結果は配列として返されます。

、返さ観測可能で購読:

getImages().subscribe(() => { 
    console.log("Fork Join Done"); 
}); 

、観察が実行されます何も加入していないなくて、怠惰なので...

編集

あなたはétiAgeメソッドを更新できこの方法:

getImage(imageUrl: string) { 

     console.log("Fetching from " + imageUrl); 

     return this.httpService.get(imageUrl) 
      .map(res => { 
       return res.json(); 
      }) 
      .map(res => res.photos.photo[0]) 
      .map(res => this.generateImageUrl(res)); 
    } 
+0

コードの別の部分で 'getImages'を購読しています(関数を呼び出すコードはobservableを返し、subscribeが呼び出されます) – CodyBugstein

+0

実行された?あなたは 'getImage'内で' this.httpService.get(... ')を直接返さないのでしょうか?' getImage'で返されたobservableを購読する方法を質問に追加できますか?ありがとう! –

+0

OKIが追加されました。 – CodyBugstein

関連する問題