欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Angular请求防抖处理第一次请求失效问题

程序员文章站 2022-03-21 19:38:49
问题: 根据项目中的需求,需要设计一个下拉框,在输入时根据内容提供实时的建议,在此我们使用了如下组件,

问题:

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

<p-autocomplete [(ngmodel)]="text" [suggestions]="results" 
(completemethod)="search($event)">
</p-autocomplete>

因为我们需要根据输入内容实时的查询后台返回结果,如果每次更改都要传给后台的话,太耗费资源,而且对用户也不友好,为此我们采用了angular的请求防抖做处理,代码如下。

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 秒)。

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

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

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

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方法,这是虽然产生了值,但是还没有进行订阅,所以第一次的值并不会向后台发起请求,而之后因为我们已经订阅了这个东西,所以第一次请求之后的请求都有效果。

结果方法:

在初始化的时候就进行订阅,这样在之后的查找我们只需要使用next传值即可,我们已订阅的对象就会自动触发后台请求。

总结:

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

以上所述是小编给大家介绍的angular请求防抖处理第一次请求失效问题,希望对大家有所帮助