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 相关文章推荐
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
Jul 10 Javascript
xmlhttp缓存清除的2种解决方法
Dec 13 Javascript
JS自调用匿名函数具体实现
Feb 11 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
jQuery实现的简单提示信息插件
Dec 08 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
jQuery动态生成Bootstrap表格
Nov 01 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
Nov 25 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代码把全角数字转为半角数字
2007/12/10 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
js实现常用排序算法
2016/08/09 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
Python_LDA实现方法详解
2017/10/25 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
python如何重载模块实例解析
2018/01/25 Python
详解python实现线程安全的单例模式
2018/03/05 Python
python使用RNN实现文本分类
2018/05/24 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Python实现时间序列可视化的方法
2019/08/06 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
招聘单位介绍信
2014/01/14 职场文书
学期自我评价
2014/01/27 职场文书
南极大冒险观后感
2015/06/05 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
Python并发编程实例教程之线程的玩法
2021/06/20 Python
python 管理系统实现mysql交互的示例代码
2021/12/06 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python