在 Angular 中的解析器中简单订阅 11. 如何等到订阅完成以便我可以比较数据

Simple subscribe within the resolver in Angular 11. How to wait until subscribe is complete so I can do a comparison of data

这与其他问题不同,因为我试图在 map() 方法中进行订阅。

我最近开始使用解析器,但对于异步功能在管道和订阅之间的工作方式仍然有点不确定。

我有一个方法 getAssociatedPartners,它将 return 一个对象数组。 [{partnerId:1},{partnerId:10}]。 在这个方法中是一个订阅,它将调用后端来获取这个数据。

我还有一个 resolve 方法,它使用 getPartnerById 再次调用另一个数据库,并获得一个对象 {id:1, partnerId:10}。

一旦来自 getAssociatedPartners 的订阅完成,并且来自 getPartnerById 的数据也已完成,我想看看来自 getAssociatedPartners 和 this.partner.id 的数组中的 partnerId 是否匹配。
如果是这样,那么我想继续和 return 结果一样就行了 --> return partner as Partner。如果没有那么我会重定向。

如何让方法 this.getAssociatedPartners 等到数据被 returned,以便我可以使用 var partnerIds 与 this.partner 进行比较?

目前它不等待,在数据 returned 之前传递方法并完成解析器。 “here2”在 this.getAssociatedPartners 有数据 returned.

之前得到 console.logged
      resolve(route: ActivatedRouteSnapshot): Observable<Partner> {
    return this.aService.getPartnerById(route.params['id']).pipe(
      map((partner) => {
        var partnerIds = this.getAssociatedPartners(route.params['seoUrl']);
        console.log("here2")
            this.partner = partner;
            if (this.partner === undefined) {
                this.router.navigate(['**']);
              } else {
                if (!this.partner.website.includes('http')) {
                  this.partner.website = 'https://' + this.partner.website;
                }
              }
          return partner as Partner;
      }),
      catchError(() => {
        this.router.navigate(['/error']);
        return EMPTY;
      })
    );
  }

  getAssociatedPartners(seoUrl:string) : object[]{
      console.log(seoUrl)
    this.VHService.getPartnerIds(seoUrl).subscribe((result) =>{
        this.partnerIds = result.data;
        console.log("here1")
    })
    return this.partnerIds;
  }

我认为您可以使用 forkJoin 将 2 个 observable 和 return 您想要的那个结合起来。我的设置与您不同,因此您可能需要修改此代码。

这应该允许您 运行 两个可观察值并比较它们的结果。

如果有帮助请告诉我。


resolve(route: ActivatedRouteSnapshot): Observable<Partner> {
return forkJoin(
    // as of RxJS 6.5+ we can use a dictionary of sources
    {
      p1: this.aService.getPartnerById(route.params['id']),
      p2:  this.VHService.getPartnerIds(route.params['seoUrl'])
    }
  ).pipe(
    map((partners) => {
      /*  logic 
          Access both observables as like an map
          partners.p1
          partners.p2
      */
      return partners.p1 as Partners;
    }),
    catchError(() => {
      this.router.navigate(['/error']);
      return EMPTY;
    })
  );
}