angular - Zip sänder inte värden efter att de första värdena från båda observables har sänds


Jag försöker kombinera två observabler, en av dem är ruttparametrar och den andra en egen.

Jag använder zip eftersom forkJoin inte verkar fungera. Men zip beter sig konstigt, för när jag skickar ut min egen får jag inte det värdet. Jag får bara det första null-värdet som har givits till min BehaviorSubject som ett standardvärde.

Jag läste detta

"Zip-operatorn kommer att prenumerera på alla inre observables och vänta på att varje ska skicka ett värde. När detta sker kommer alla värden med motsvarande index att skickas vidare. Detta fortsätter tills minst en inre observable är klar."

Betyder det att det inte kommer att svara förrän båda observables har skickat ett värde? Eftersom route params-observable bara kommer att skicka ett värde en gång, men dataEmitter kommer att fortsätta skicka värden. Vilken operator skulle vara korrekt att använda i detta fall?

Här är lite av min kod:

Sändare i min tjänst:

private dataEmitter: BehaviorSubject<any> = new BehaviorSubject<any>(null);

Komponentsprenumeration, få bara null från dataEmitter, aldrig this.calculatedData:

Observable.zip(this.route.params, this.dataCalculator.dataEmitter$)
  .subscribe(data => console.log(data));

Detta kallas när alla beräkningar har gjorts:

this.dataEmitter.next(this.calculatedData);

Svar #1

Som påpekats av @cartant fungerar det som förväntat att byta till combineLatest:

Observable.combineLatest(this.route.params, this.dataCalculator.dataEmitter$)
  .subscribe(data => console.log(data));

Svar #2

Din zip fungerar alldeles utmärkt. null är ett värde. Du kan använda dataEmitter.filter(val => !isNullOrUndefined(val)) för att filtrera bort null- och undefined-värden.

Relaterade artiklar