具有地图角度的管道可观察订阅

时间:2019-10-31 18:08:05

标签: angular pipe observable

实际上,我想使用数组值作为参数来调用另一个函数。我从一个主题获取数组:

this.shopService.$getShops().pipe(map(
  shops => {
    console.log(shops[0]);
  }
)).subscribe();

订阅基于此:

      private newShopsSubj = new BehaviorSubject(undefined);

  setShops(shops: any) {
    this.newShopsSubj.next(shops);
  }


  $getShops(): Observable<any> {
    return this.newShopsSubj.asObservable();
  }

实际上,代码正在运行...但是console.log调用以undefined结尾。不知何故我找不到合适的解决方案。

我想做:

   this.shopService.$getShops().subscribe(resp => {
this.shopService.getProductsByShopID(resp[0].id).subscribe(resp
=> {do something...};});

但是实际上却失败了,因为resp[0].id停留在undefined ... 我对地图的尝试失败。

任何帮助表示赞赏...

谢谢

Hucho

2 个答案:

答案 0 :(得分:2)

与其他答案类似...如果在设置值之前调用$getShops(),则会得到undefined,因为它是初始值。您可以将其初始化为空数组,或使用rxjs filter过滤掉undefined值。另外,我会将这些请求与switchMapmergeMap链接在一起,因为不建议嵌套订阅。所以我建议如下:

private newShopsSubj = new BehaviorSubject([]);
public newShopsSubj$ = this.newShopsSubj.asObservable();

和组件代码:

import { mergeMap, filter } from 'rxjs/operators';
import { of } from 'rxjs';

// ...

this.shopService.newShopsSubj$.pipe(
  mergeMap((shops: any[]) => {
    // do a check that that there is an object
    if (shops && shops.length) {
      return this.shopService.getProductsByShopID(shops[0].id)
    }
    // no shops, so return...
    // empty array, since assuming the above function returns array of products
    return of([]);
  })
).subscribe((products: any[]) => {
  // check if products exist and do your magic!
})

或如前所述,将您的BehaviorSubject初始值设为undefined,并将filter除去这些值:

this.shopService.newShopsSubj$.pipe(
  filter(shops => !!shops)
  mergeMap((shops: any[]) => {
  // .....

请注意,我在这里使用了any。不要使用它。将数据输入模型! (我更喜欢接口)。

,请记住退订OnDestroy

答案 1 :(得分:0)

BehaviourSubject将当前值发送给新订阅者。

在这里,您要使用undefined初始值进行初始化

private newShopsSubj = new BehaviorSubject(undefined);

因此,当您按以下方式订阅时

  this.shopService.$getShops().subscribe(resp => {
this.shopService.getProductsByShopID(resp[0].id).subscribe(resp
=> {do something...};});

最初,它将得到resp作为未定义。 要解决此问题,您可以使用Subject代替BehaviorSubject或使用适当的shop对象初始化BehaviourSubject