Observable<void> bruksmønster i Typescript


Når en asynkron tjeneste ikke har noen returverdi, men jeg ønsker å bruke Observables, er jeg tilbøyelig til å bruke Observable<boolean>. Men jeg har ingen mening for denne boolske verdien fordi tjenesten enten mislykkes eller lykkes, og hvis den mislykkes ønsker jeg at Observable skal være i feilstaten. Dette etterlater kun 'true'-verdier for den observerte booleanen.

Er den følgende bruken av Observable<void> et godt mønster for disse situasjonene? Eller er det forutsigbare problemer med bruken av Observable<void>?

const asyncFuncWithoutResult = (): Observable<void> => {
  // fake something async that has no return value

  const itWorked = true; // or not
  if (itWorked) {
    return Observable.of();
  } else {
    return Observable.throw(Error('It did not work'));
  }
}

// call the service
asyncFuncWithoutResult()
  .subscribe(
    undefined, // nothing will be emitted when using Observable.of()
    (err: any) => console.error(err), // handle error state
    () => console.log('Success'),     // handle success state
  );

Svar #1

Bare for å være mer presis, når du definerer et Subject med generisk type void, er det to måter du kan kalle dets next()-metode på, og det er uten noen argumenter:

const subject = new Subject<void>();
subject.next();

...eller med void 0:

subject.next(void 0);

Faktisk er value-argumentet til next valgfritt, så hvis du ikke spesifiserer det, vil det sende undefined, noe som betyr at selv om du har Subject<void> vil du fortsatt motta next-varsler:

asyncFuncWithoutResult().subscribe(alawaysUndefined => {
  /* ... */
});

Merk også at du kan gjøre enhver Observable om til <void> (dette er nødvendig når du vil slå sammen flere Observables) ved å bruke map:

source.pipe(map(() => void 0))
   ...

Relaterte artikler