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)
  )
}

Relaterade artiklar