通过观察,我有一个searchTextStream
,一个enterKeyStream
和resultStream
。
我有类似的东西用于搜索和获得结果(我相信我可以改进以使用冷可观察结果)
this.searchTermStream.asObservable()
.pipe(
debounceTime(400),
distinctUntilChanged()
)
.subscribe(term => {
this.search(term, (result) => {
this.resultStream.next(result);
});
});
我试图在ENTER上获得数据的结果,但是使用最新的resultStream。需要注意的是,如果我打字,我不想获得旧的resultStream。
三种情景
combineLatest
非常简单。combineLatest
不会很好。如何连线?我可能缺少一些关于操作员的知识。
答案 0 :(得分:0)
withLatestFrom
和switchMap
应符合您的要求。 function based index
http://reactivex.io/documentation/operators/combinelatest.html
http://reactivex.io/documentation/operators/flatmap.html
import { Subject, Observable } from 'rxjs'
import { withLatestFrom, debounceTime, distinctUntilChanged, map, merge, switchMap } from 'rxjs/operators'
const searchText$ = new Subject<string>();
const enterKey$ = new Subject<void>();
const result$ = new Subject<any>();
function search(text: string): Observable<any> {
return new Observable(observer => {
this.search(text, result => {
observer.next(result)
})
})
}
const debouncedInput$ = searchText$.pipe(
debounceTime(400),
distinctUntilChanged(),
map(text => ({text, enter: false}))
)
enterKey$.pipe(
withLatestFrom(searchText$),
map(([_, text]) => ({text, enter: true}))
).pipe(
merge(debouncedInput$),
switchMap(({text}) => search(text))
).subscribe((result) => {
result$.next(result)
})