【发布时间】:2017-12-30 17:35:10
【问题描述】:
我有两个输入字段,街道地址和邮政编码,它们每个都在 keyup 上发出它的值作为主题(Angular 的事件发射器)。
我希望在使用它们调用 API 端点之前让这两个发射器值都有效。
第一个可观察的,街道地址:
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'))
第二个可观察到的邮编:
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'))
要测试的简单forkJoin(与 combineLatest 尝试相同的实现):
forkJoin(this.searchableComponent.value, this.zipcodeInput.value)
.subscribe((results: any) => {
console.log(results)
})
我尝试在两个可观察对象上使用forkJoin,尽管它们中的任何一个可观察对象似乎都没有发出任何东西。
在第一个 observable 有效并完成后尝试使用 combineLatest 时,它们的组合会在第二个 observable 的每次发出(即使无效)时完成。
当所有观察者都完成后,实现多个观察者完成的正确方法是什么?
【问题讨论】:
-
尝试 forkjoin 整个流,而不仅仅是 .value
-
.value 是流,它是一个Subject。
-
forkJoin在其所有源 observables 完成之前不会发出。 -
两个输入都包含有效值,但它们都不会发出(console.log 调用不会产生)
标签: javascript angular typescript rxjs