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?
Versuchen Sie Forkjoin den gesamten Stream außer einfach. Wert –
. Wert ist der Stream, es ist ein [Betreff] (http://reactivex.io/rxjs/manual/overview.html#subject). –
'forkJoin' wird erst emittiert, wenn alle Quellobservablen vollständig sind. – cartant