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


Posted in Javascript onMay 17, 2019

问题:

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

<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请求防抖处理第一次请求失效问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 获取图片颜色
Apr 05 Javascript
javascript 全角转换实现代码
Jul 17 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
Jan 24 Javascript
Vue.directive自定义指令的使用详解
Mar 10 Javascript
javascript 中的try catch应用总结
Apr 01 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 Javascript
p5.js入门教程之平滑过渡(Easing)
Mar 16 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
Apr 19 jQuery
vue总线机制(bus)知识点详解
May 10 Javascript
原生js+canvas实现验证码
Nov 29 Javascript
vue cli 3.0 搭建项目的图文教程
May 17 #Javascript
小程序云开发如何实现图片上传及发表文字
May 17 #Javascript
tsconfig.json配置详解
May 17 #Javascript
小程序云函数调用API接口的方法
May 17 #Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 #Javascript
微信小程序云开发之使用云函数
May 17 #Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 #jQuery
You might like
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
请离开include_once和require_once
2013/07/18 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
js资料toString 方法
2007/03/13 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
Vue实现简单分页器
2018/12/29 Javascript
vue生命周期的探索
2019/04/03 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
Python读写压缩文件的方法
2020/07/30 Python
python3.5的包存放的具体路径
2020/08/16 Python
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
工程总经理工作职责
2013/12/09 职场文书
新农村建设标语
2014/06/24 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
2015年教师新年寄语
2014/12/08 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL