2017-12-30 8 views
0

Ich habe zwei Eingabefelder, Adresse und Postleitzahl, die jeder von ihnen gibt es Wert auf Keyup als Subject (Angular's Event Emitter).forkJoin an zwei Eingängen

Ich möchte, dass beide Emitterwerte gültig sind, bevor Sie einen API-Endpunkt aufrufen, der sie verwendet.

erste beobachtbare, Straße Adresse:

this.searchableComponent.value 
      .do((value: any) => { 
       if (value.length < this.MINIMAL_LENGTH_FOR_SEARCH) { 
        this.suggestions = []; 
       } 
      }) 
      .filter(() => this._zipcodeModel !== undefined && this._zipcodeModel.city.length > 0) 
      .filter((value: any) => value.length >= this.MINIMAL_LENGTH_FOR_SEARCH) 
      .debounceTime(this.DEBOUNCE_TIME_IN_MS) 
      .distinctUntilChanged() 
      .do(() => console.log('ready street address')) 

Zweite beobachtbaren Postleitzahl:

this.zipcodeInput.value 
     .filter((value: string) => { 
      const pattern = new RegExp(US_ZIPCODE); 

      return pattern.test(value); 
     }) 
     .distinctUntilChanged() 
     .mergeMap((zipcode: string) => this.addressService.lookup(zipcode)) 
     .map((zipcodeModel: ZipcodeModel) => this._zipcodeModel = zipcodeModel) 
     .do(() => console.log('ready zipcode')) 

Die einfache forkJoin zu testen (die gleiche Umsetzung wie combineLatest Versuch):

forkJoin(this.searchableComponent.value, this.zipcodeInput.value) 
      .subscribe((results: any) => { 
       console.log(results) 
      }) 

Ich versuchte mit forkJoin auf zwei der Observablen, obwohl keiner von ihnen Observables etwas ausgibt. Bei dem Versuch, combineLatest zu verwenden, nachdem das erste Observable gültig und abgeschlossen war, wurde die Kombination von ihnen bei jedem Emit, auch wenn ungültig, des 2. Observablen abgeschlossen.

Was ist der richtige Weg, um mehrere Beobachter zu vervollständigen, wenn alle abgeschlossen sind?

+0

Versuchen Sie Forkjoin den gesamten Stream außer einfach. Wert –

+0

. Wert ist der Stream, es ist ein [Betreff] (http://reactivex.io/rxjs/manual/overview.html#subject). –

+0

'forkJoin' wird erst emittiert, wenn alle Quellobservablen vollständig sind. – cartant

Antwort

0

Ich habe eine Lösung mit withLatestFrom gefunden.

Durch Hinzufügen von .withLatestFrom(this.zipcodeInput.value) zu der Straße Adresse beobachtbar habe ich es geschafft, die Abhängigkeit zu schaffen, die ich wollte.

Kann immer noch nicht verstehen, warum forkJoin den Trick nicht gemacht hat.

+0

[ForkJoin] (https://www.learnrxjs.io/operators/combination/forkjoin.html) funktioniert nicht, weil forkJoin gibt nur nach dem Ende der Quellobservablen "complete" aus. Die Quelle wird nicht vervollständigt, sie geben nur Werte auf keyup aus – LLai

Verwandte Themen