按ENTER键并延迟结果后获得observable的结果

时间:2018-04-13 21:47:12

标签: rxjs observable

通过观察,我有一个searchTextStream,一个enterKeyStreamresultStream

我有类似的东西用于搜索和获得结果(我相信我可以改进以使用冷可观察结果)

this.searchTermStream.asObservable()
    .pipe(
        debounceTime(400),
        distinctUntilChanged()
    )
    .subscribe(term => {
        this.search(term, (result) => {
            this.resultStream.next(result);
        });
    });

我试图在ENTER上获得数据的结果,但是使用最新的resultStream。需要注意的是,如果我打字,我不想获得旧的resultStream。

三种情景

  1. 结果是。我按ENTER我想得到结果。这里combineLatest非常简单。
  2. 结果在,但我输入更多,然后按ENTER键。我不想要陈旧的结果,但是等待新的结果先进入,然后执行我的ENTER流。
  3. 没有结果,我按ENTER键不会发生任何事情。在这种情况下,combineLatest不会很好。
  4. 如何连线?我可能缺少一些关于操作员的知识。

1 个答案:

答案 0 :(得分:0)

withLatestFromswitchMap应符合您的要求。 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)
})