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遮罩层效果 兼容ie firefox jQuery遮罩层
Jul 26 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
checkbox设置复选框的只读效果不让用户勾选
Aug 12 Javascript
jquery ajax属性async(同步异步)示例
Nov 05 Javascript
jquery如何扑捉回车键触发的事件
Apr 24 Javascript
jQuery实现单击和鼠标感应事件
Feb 01 Javascript
如何利用Promises编写更优雅的JavaScript代码
May 17 Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 Javascript
vue+node+webpack环境搭建教程
Nov 05 Javascript
关于vue状态过渡transition不起作用的原因解决
Apr 09 Javascript
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
js实现表格单列按字母排序
Aug 12 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 方便水印和缩略图的图形类
2009/05/21 PHP
PHP输出时间差函数代码
2013/01/28 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python删除列表中重复记录的方法
2015/04/28 Python
Python易忽视知识点小结
2015/05/25 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
面料业务员岗位职责
2013/12/26 职场文书
消防安全汇报材料
2014/02/08 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
搞笑婚前保证书
2015/02/28 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python