typescript - Angular lyssna på prenumerationsstart av rxjs observable?
Finns det ett sätt att upptäcka starten av prenumerationen på en RxJS-observable inom pipen?
Jag vill trigga en laddningsindikator när en HTTP-observable (som förstörs när svaret har slutförts) blir prenumererad på.
Eller måste jag skapa ett wrapper-observable för denna åtgärd?
Svar #1
Det beror på vilken version av RxJS du använder. Med RxJS < 7.3 kan du använda defer():
defer(() => {
loadingFlag = true;
return this.http.doyourrequest().pipe(
finalize(() => loadingFlag = false),
);
});
Sedan RxJS >= 7.3 kan du använda nya händelsehanterare för tap():
this.http.doyourrequest().pipe(
tap({
subscribe: () => loadingFlag = true,
finalize: () => loadingFlag = false,
}),
);
Svar #2
eftersom varje prenumeration på http-observable orsakar ett nytt http-anrop är det säkert att sätta en sådan flagga utanför pipen, åtminstone är det så jag gör det.
getSomeData(){
loadingFlag=true;
return this.http.doyourrequest().pipe(finalize(()=>loadingFlag=false));
}
om du verkligen vill gå igenom sub-antalet (som alltid går ner till 0 efter varje begäran på grund av finalisering av http-obs) kolla implementeringen av refCount() och share()-operatorerna som internt räknar abonnenterna
Redigera :
Du kan kapsla in inställningen av flaggan genom att använda ett dummy-observable som en ingångspunkt, t.ex.
getSomeData(){
return of(null).pipe(
tap(()=>loadingFlag=true),
switchMapTo(this.http.doyourrequest()),
finalize(()=>loadingFlag=false)
)
}
