遍历顺序API调用Rxjs(链表)

Traversing sequential API calls Rxjs (Linked List)

如何遍历链表结构中的顺序 API 调用?现在,我每 5 秒发出一次请求,获取 OrdersList 数据。该对象包含一个字段 results,其中包含一个 Order 对象数组,它还包含一个 next 字段,其中包含一个请求 URL 以访问下一个订单数组,因为它们不是一次性全部发送。

我的orders.component.ts:

ngOnInit(): void {
    this.subscription = timer(0, 5000).pipe(
        switchMap(() => this.apiManager.fetchShopOrders())
      ).subscribe(orders => {
      
            const loadedOrders: OrdersList = orders;

            /* not working - try to get next set(s) of orders */
            if(loadedOrders.next != null){
                while(loadedOrders.next != null){
                    let response = this.apiManager.fetchNextSetOfOrders(loadedOrders.next).toPromise();
                    response.then((nextSetOrders) => {
                        const loadedNextSetOrders: OrdersList = nextSetOrders;
                        loadedOrders.next = loadedNextSetOrders.next;
                        loadedOrders.results = [...loadedOrders.results, ...loadedNextSetOrders.results];
                    })
                } 
            }
            ...
            /* do stuff with the orders */
            ...
    });
}

我的ApiManagerService:

@Injectable({ providedIn: 'root' })
export class ApiManagerService {

    private API_KEY = "...";
    private API_SECRET = "...";
    private token = "...";
    private webzine_id: string = "...";

    constructor(private http: HttpClient) {}

    fetchShopOrders() {
        const url = "https://commerce.ww-api.com/commerceapi/v1/order/" + this.webzine_id + "/order/?per_page=10";
        return this.http
            .get<OrdersList>(url, {
                headers: new HttpHeaders({
                    "API-KEY": this.API_KEY,
                    "API-SECRET": this.API_SECRET
                }),
            });
    }

    fetchNextSetOfOrders(nextSetUrl: string) {
        return this.http
            .get<OrdersList>(nextSetUrl, {
                headers: new HttpHeaders({
                    "API-KEY": this.API_KEY,
                    "API-SECRET": this.API_SECRET
                }),
            });
    }
}

如何才能按顺序将下一组订单添加到我的 OrdersList 对象?

提前致谢。

您可以使用 expand 运算符递归 link 列表并获取数据 sequantially/recursively。

主要代码:

ngOnInit() {
  this.apiManager
    .fetchShopOrders()
    .pipe(
      expand(res => {
        if (res.results) {
          this.results.push(...res.results);
        }

        if (res.next) {
          return this.apiManager.fetchNextSetOfOrders(res.next);
        }

        return of(EMPTY);
      }),
      takeWhile(res => !!res.next) // take while res.next is defined
    )
    .subscribe(console.log);
}

Stackblitz demo