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 相关文章推荐
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 Javascript
jquery触发a标签跳转事件示例代码
Jul 21 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
Sep 07 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
jquery基本选择器匹配多个元素的实现方法
Sep 05 Javascript
vue.js+Echarts开发图表放大缩小功能实例
Jun 09 Javascript
详解封装基础的angular4的request请求方法
Jun 05 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
JavaScript鼠标拖拽事件详解
Apr 03 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 Javascript
WebRTC记录音视频流(web技术分享)
Feb 24 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
大家须知简单的php性能优化注意点
2016/01/04 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
asp.net和php的区别点总结
2019/10/10 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
python和C语言混合编程实例
2014/06/04 Python
打包发布Python模块的方法详解
2016/09/18 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
对Python实现累加函数的方法详解
2019/01/23 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
基于pandas中expand的作用详解
2019/12/17 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
keras:model.compile损失函数的用法
2020/07/01 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
自强之星事迹材料
2014/05/12 职场文书
环保建议书100字
2014/05/14 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
员工升职自荐信
2015/03/27 职场文书
公司周年庆典致辞
2015/07/30 职场文书
Python图片检索之以图搜图
2021/05/31 Python
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android