2017-07-08 2 views
1

以前の呼び出しの値を使用してRedditのAPIに再帰的なhttp呼び出しを試みています。問題は、前のコールが次のコールが開始する前に終了していないため、重複したコールが行われていることです。 "after"値が未定義になるまで、 "after"値はすべての呼び出しに対して更新されるべきです。私はこれを見つけたrelated postと解決策を使用しようとしましたが、私は次の呼び出しを行う前に前の呼び出しが終了していることを確認する方法を見つけることができません。以下は、私の実際のコードです:同じ機能getSavedPostsForAuthenticatedUserを返す角 - RXJS拡張演算子を使用して再帰的なhttp呼び出しを正しく実行する

private getSavedPostsForAuthenticatedUser(username: string, after: string, userPosts: any) { 
    const headers = new Headers(); 
    if (!userPosts) { 
     userPosts = []; 
    } 
    headers.append('Authorization', `Bearer ${this._token}`); 
    const redditUrl = `${RetainerConfig.redditOauthUrl}user/${username}/saved`; 
    const url = after ? `${redditUrl}/?after=${after}` : redditUrl; 
    return this._http.get(url, { headers: headers }) 
     .map(response => response.json()) 
     .expand(response => { 
      if (response.data) { 
       for (const post of response.data.children) { 
        userPosts.push(post); 
       } 
       if (response.data.after) { 
        return this.getSavedPostsForAuthenticatedUser(username, response.data.after, userPosts); 
       } 
      } 
      return Observable.of(userPosts); 
     }); 
+0

おそらく問題の一部は、あなたが 'expand'に渡すプロジェクト関数が空の観測可能性を返さないということです。そうすることなく、私は拡大がどのように止まるか見ることができません。 – cartant

+0

これは正しいです。受け入れられた答えに記載されているように、私は再帰的に、開始のような問題を引き起こす展開演算子を呼び出していました。 – jacobisaman

答えて

2

は、再帰が膨張の原因となります。これを解決するには、http observableを分離する必要があります。

private getSavedPostsForAuthenticatedUser(username: string, after: string, userPosts: any) { 
    const request$ = this._getRequest(username, after, userPosts); 
    if (!userPosts) { 
     userPosts = []; 
    } 
    return request$ 
     .expand(response => { 
     if (response.data) { 
      for (const post of response.data.children) { 
      userPosts.push(post); 
      } 
      if (response.data.after) { 
      return this._getRequest(username, response.data.after, userPosts); 
      } 
     } 
     return Observable.of(userPosts); 
     }); 
    } 

    private _getRequest(username: string, after: string) { 
    const headers = new Headers(); 
    headers.append('Authorization', `Bearer ${this._token}`); 
    const redditUrl = `${RetainerConfig.redditOauthUrl}user/${username}/saved`; 
    const url = after ? `${redditUrl}/?after=${after}` : redditUrl; 

    return this._http.get(url, {headers: headers}) 
     .map(response => response.json()); 
    } 

Observable.empty()を使用して拡大を停止することができます。これはpostを参照してください。

+0

ありがとう!私はこれにしばらくこだわっており、この答えは私の問題を解決しました。 – jacobisaman

関連する問題