2017-07-08 73 views
1

我正在尝试使用前一个调用的值对Reddit的API进行递归http调用。问题在于之前的呼叫在下一个呼叫开始之前没有完成,因此正在进行重复呼叫。应该为每次调用更新“after”值,直到“after”值未定义为止。我发现这个related post,并试图使用所描述的解决方案,但我无法弄清楚如何在下次调用之前确保先前的调用已完成。下面是我的实际代码:角 - 正确使用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

返回相同的功能getSavedPostsForAuthenticatedUser会导致递归膨胀。为了解决这个问题,你需要分开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