typescript - RxJS combineLatest-funktion kan importeras både från rxjs och rxjs/operators, vad är skillnaden mellan de två?
Funktionen combineLatest kan importeras antingen från rxjs och från rxjs/operators.
När jag importerar det från rxjs/operators (precis som jag importerar combineAll) får jag följande fel:
TS2339: Property 'subscribe' does not exist on type 'OperatorFunction<{}, [{}, number, number, number]>'
Jag använde följande kodsnutt:
import { timer } from "rxjs";
import { combineLatest } from "rxjs/operators";
const timerOne = timer(1000, 2500);
const timerTwo = timer(1500, 2500);
const timerThree = timer(2000, 2500);
//when one timer emits, emit the latest values from each timer as an array
const combined$ = combineLatest(timerOne, timerTwo, timerThree);
combined$.subscribe(
([timerValOne, timerValTwo, timerValThree]) => console.log(`Timer One Latest: ${timerValOne}, Two Latest: ${timerValTwo}, Three Latest: ${timerValThree}`)
);
Därför försökte jag importera det från rxjs istället för rxjs/operators :
import { combineLatest } from "rxjs";
Och plötsligt fungerade det. Trevligt, men kan någon förklara vad skillnaden är mellan de två?
Svar #1
import { combineLatest } from "rxjs";Detta är den så kallade "Observable creation method". I princip en metod som returnerar en Observable baserat på de argument du skickar till den (precis som
from()ellerof()). Eftersom den returnerar en instans avObservablehar densubscribe()-metoden.import { combineLatest } from "rxjs/operators";Detta är en operator som är tänkt att användas inom en operatorlänk. Det är en metod som returnerar en annan metod som prenumererar på den föregående Observable och returnerar en annan Observable som bearbetar varje värde som passerar genom dess utgång.
Det är därför det ger dig felet Property 'subscribe' does not exist on type..... Metoden subscribe() finns inte på en metod som returneras från combineLatest()-operatorn (den returnerar ännu en funktion).