在 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;
})
);
}
这与其他问题不同,因为我试图在 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;
})
);
}