Angular - 正确使用RXJS扩展运算符进行递归http调用

jac*_*man 2 recursion reddit rxjs typescript angular

我试图使用前一次调用的值对Reddit的API进行递归的http调用.问题是前一个呼叫在下一个呼叫开始之前没有完成,因此正在进行重复呼叫.应该为每个调用更新"after"值,直到"after"值未定义.我找到了这个相关的帖子,并试图使用所描述的解决方案,但我无法弄清楚如何在下次通话之前确保之前的通话已完成.以下是我的实际代码:

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);
        });
Run Code Online (Sandbox Code Playgroud)

Ahm*_*yad 6

返回相同的函数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());
  }
Run Code Online (Sandbox Code Playgroud)

要停止扩展,您可以使用Observable.empty().请参考这篇文章.