【问题标题】:Angular RXJS multiple HTTP nested requestsAngular RXJS 多个 HTTP 嵌套请求
【发布时间】:2018-07-13 16:23:57
【问题描述】:

我可以使用 forkjoin 运算符成功进行多个并行 http 调用(例如调用所有销售数据),但是我需要根据每个第一个(sales)http 调用的结果连接进一步的 http 调用。我不确定 mergeMap 或 concat 运算符是否最好以及它们如何适合这里

示例数据是 销售

{saleId:100, name:'bob, uri:'http://testserver/sales/100'}
{saleId:101, name:'fred, uri:'http://testserver/sales/101'}
{saleId:102, name:'billy, uri:'http://testserver/sales/102'}


products
{id:1,saleId:101, detail:'test1', product:{id:200, uri:'http://testserver/product/200'} }
{id:1,saleId:101, detail:'test1', product:{id:201, uri:'http://testserver/product/201'} }
{id:1,saleId:101, detail:'test1', product:{id:202, uri:'http://testserver/product/202'} }

getServerChildNodes(childNodeObj: any[]): Observable<any> {
    //observablesListArray contains http sales uri
    return forkJoin(observablesListArray)
        .map((data: any[]) => {
            for (let i = 0; i < data.length; i++) {
               outputData.push(data[i].json());
            }
            return outputData;
        });
}

【问题讨论】:

    标签: angular rxjs angular2-observables fork-join


    【解决方案1】:

    我不确定我是否正确理解了您的问题,但您似乎正在寻找一种方法来连接 2 个后续 http 调用,而第二个调用需要第一个返回的一些数据。另外,您希望并行运行许多这样的链式调用。

    如果是这种情况,这可能是一种解决方法。

    getSaleIds(): Observable<string[]>;
    
    getSale(id: string): Observable<Sale> {
      // calls and http service and returns a Sale for a certain id
      // each Sale contains a productId to be used in the subsequent call
    }
    
    getProduct(productId: string): Observable<Product> {
      ...
    }
    
    getSaleAndThenProduct(saleId: string) {
      return getSale(saleId).pipe(
        switchMap(sale => getProduct(sale.productId),
        map(product => ({sale, product}))
      );
    }
    
    getSaleIds()
    .pipe(
      map(saleIds => saleIds.map(id => getSaleAndThenProduct(id)),
      switchMap(functions => forkJoin(functions))
    )
    .subscribe(salesAndProducts => // do something)
    

    salesAndProducts{sale: Sale, product: Product} 类型的对象数组

    【讨论】:

    • 谢谢 Picci... 在您的回复中,salesId 设置为 CONST saleId...所以假设它已经可用但是我的所有销售 id /sales 数据列表最初是从另一个 http 服务返回的。是否可以将第一个 http 调用包装到相同的逻辑中,或者是否需要先请求/可用。关于麦克斯
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多