這與其他問題不同,因為我試圖在 map() 方法中進行訂閱。
我最近開始使用決議器,但關于異步功能在管道和訂閱之間的作業方式仍然有點不確定。
我有一個方法 getAssociatedPartners 將回傳一個物件陣列。[{partnerId:1},{partnerId:10}]。在這個方法中有一個訂閱,它將呼叫后端來獲取這些資料。
我還有一個決議方法,它使用 getPartnerById 再次呼叫另一個資料庫,并獲取一個物件 {id:1,partnerId:10}。
一旦 getAssociatedPartners 的訂閱完成,并且 getPartnerById 的資料完成,我想看看 getAssociatedPartners 和 this.partner.id 的陣列中的 partnerId 是否匹配。
如果是這樣,那么我想繼續并回傳結果,因為它是在線的-> 作為合作伙伴回傳合作伙伴。如果沒有,那么我將重定向。
如何使 this.getAssociatedPartners 方法等到資料回傳,以便我可以使用 var partnerIds 與 this.partner 進行比較?
目前它不等待,并在回傳資料之前傳遞方法并完成決議器。"here2" 在 this.getAssociatedPartners 回傳資料之前獲取 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;
}
uj5u.com熱心網友回復:
我認為您可以使用 forkJoin 組合 2 個 observables 并回傳您想要的那個。我沒有與您相同的設定,因此您可能需要修改此代碼。
這應該允許您運行兩個可觀察物件并比較它們的結果。
讓我知道這是否有幫助。
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;
})
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462284.html
