angular请求防抖,以及处理第一次请求失效

问题:this

根据项目中的需求,须要设计一个下拉框,在输入时根据内容提供实时的建议,在此咱们使用了以下组件,设计

<p-autoComplete [(ngModel)]="text" [suggestions]="results" (completeMethod)="search($event)"></p-autoComplete>

由于咱们须要根据输入内容实时的查询后台返回结果,若是每次更改都要传给后台的话,太耗费资源,并且对用户也不友好,为此咱们采用了angular的请求防抖作处理,代码以下。code

packages$: Observable<NpmPackageInfo[]>;
private searchText$ = new Subject<string>();

search(packageName: string) {
  this.searchText$.next(packageName);
}
 
ngOnInit() {
  this.packages$ = this.searchText$.pipe(
    debounceTime(500),
    distinctUntilChanged(),
    switchMap(packageName =>
      this.searchService.search(packageName, this.withRefresh))
  );
}

做用以下:对象

debounceTime(500) - 等待,直到用户中止输入(这个例子中是中止 1/2 秒)。ip

distinctUntilChanged() - 等待,直到搜索内容发生了变化。资源

switchMap() - 把搜索请求发送给服务。get

但当咱们使用的时候发如今初始化第一次请求的时,并不会调用service的方法,错误代码以下:string

private searchText$ = new Subject<string>();
packages$: Observable<InstrumentAlias[]>;
ngOnInit() {
// 建立可观察着对象
this.packages$ = this.searchText$.pipe(
            debounceTime(500),
            distinctUntilChanged(),
            switchMap(packageName =>
                this.instrumentAliasService.queryInstrumentAliasByName(packageName))
        );
}

this.searchText$.next(this.queryName);
this.packages$.subscribe((instrumentAliases: Array<InstrumentAlias>) => {
    this.filteredinstrumentAlias = instrumentAliases;
}, () => {
    console.log('get instrumentAliases error');
});

错误缘由:
searchText$ 是一个序列,包含用户输入到搜索框中的全部值。 它定义成了 RxJS 的 Subject 对象,这表示它是一个多播 Observable,同时还能够自行调用 next(value) 来产生值,在上面错误的代码中,由于咱们先调用的时next方法,这是虽然产生了值,可是尚未进行订阅,因此第一次的值并不会向后台发起请求,而以后由于咱们已经订阅了这个东西,因此第一次请求以后的请求都有效果。it

结果方法:
在初始化的时候就进行订阅,这样在以后的查找咱们只须要使用next传值便可,咱们已订阅的对象就会自动触发后台请求。pip

总结:

写功能的时候只是简单的对代码进行复制粘贴,并无真正的理解angular的观察者的设计机制,经过这个错误加深了对angular观察者的理解。

相关文章
相关标签/搜索