Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用rxjs在Angular中嵌套api调用?_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript 如何使用rxjs在Angular中嵌套api调用?

Javascript 如何使用rxjs在Angular中嵌套api调用?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,如何使用rxjs在angular中嵌套api调用 getProducts(): Observable<any> { return this.getProductIDs().pipe( map((respnose) => respnose.products.map((data) => (item: any) => flatMap(() => this.getProduct(item.id))

如何使用rxjs在angular中嵌套api调用

  getProducts(): Observable<any> {
    return this.getProductIDs().pipe(
      map((respnose) =>
        respnose.products.map((data) => (item: any) =>
          flatMap(() => this.getProduct(item.id))
        )
      )
    );
  }


// with promises we can do something like promise.all([])... how can I achieve something similar using rxjs
&如果我这样做:

  getProducts(): Observable<any> {
    return this.getProductIDs().pipe(
      map((respnose) =>
        respnose.products.map((item: any) => this.getProduct(item.id))
      )
    );
  }
有人能提出将一个可观察结果映射到嵌套api调用(返回可观察结果)的想法吗

注意

getProduct()
也是一个返回observable的api调用

  getProduct(id): Observable<any> {
    return this.http.get<Observable<any>>(
      `http://localhost:4401/api/products/${id}`,
      {
        params: { id },
      }
    );
  }
getProduct(id):可观察{
返回this.http.get(
`http://localhost:4401/api/products/${id}`,
{
参数:{id},
}
);
}

这可能就是你要找的。你没有真正告诉我们你想做什么,所以它是非常开放的:

这将发出一个对象(产品)数组,其ID从
getProductIDs

getProducts(): Observable<any> {
  return this.getProductIDs().pipe(
    map(res => 
      res.products.map(product => this.getProduct(product.id))
    ),
    switchMap(getProducts => forkJoin(getProducts))
  );
}
getProducts():可观察{
返回此.getProductId()管道(
地图(res=>
res.products.map(product=>this.getProduct(product.id))
),
开关映射(getProducts=>forkJoin(getProducts))
);
}
通过将地图合并到switchMap中,同样的内容写得更简洁一些:

getProducts(): Observable<any> {
  return this.getProductIDs().pipe(
    switchMap(res => forkJoin(
      res.products.map(product => this.getProduct(product.id))
    ))
  );
}
getProducts():可观察{
返回此.getProductId()管道(
开关映射(res=>forkJoin(
res.products.map(product=>this.getProduct(product.id))
))
);
}
这里有一种不用forkJoin的方法,每个产品一次发射一个(不是在数组中)

getProducts():可观察{
返回此.getProductId()管道(
合并映射(res=>res.products),
mergeMap(product=>this.getProduct(product.id))
);
}
这是同样的东西,但它再次发射阵列:

getProducts(): Observable<any> {
  return this.getProductIDs().pipe(
    mergeMap(res => res.products),
    mergeMap(product => this.getProduct(product.id)),
    toArray()
  );
}
getProducts():可观察{
返回此.getProductId()管道(
合并映射(res=>res.products),
mergeMap(product=>this.getProduct(product.id)),
toArray()
);
}

如何组合观测值取决于具体的用例(是否需要从第一个到第二个的数据才能访问第二个,是否希望同时发出两个结果,等等)。阅读在哪个用例中使用哪个组合器的文档:似乎您有与此处相同的问题:
getProducts(): Observable<any> {
  return this.getProductIDs().pipe(
    switchMap(res => forkJoin(
      res.products.map(product => this.getProduct(product.id))
    ))
  );
}
getProducts(): Observable<any> {
  return this.getProductIDs().pipe(
    mergeMap(res => res.products),
    mergeMap(product => this.getProduct(product.id))
  );
}
getProducts(): Observable<any> {
  return this.getProductIDs().pipe(
    mergeMap(res => res.products),
    mergeMap(product => this.getProduct(product.id)),
    toArray()
  );
}