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使用Prototype实现面向对象的方法
Apr 14 Javascript
js实现选中复选框文字变色的方法
Aug 14 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
JavaScript入门系列之知识点总结
Mar 24 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
Dec 08 Javascript
javascript replace()第二个参数为函数时的参数用法
Dec 26 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
Apr 11 Javascript
Bootstrap Table使用整理(一)
Jun 09 Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 Javascript
Vue之Vue.set动态新增对象属性方法
Feb 23 Javascript
基于JavaScript实现简单的轮播图
Mar 03 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
jquery 插件开发备注
2010/08/27 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python 阶乘累加和的实例
2019/02/01 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
python cumsum函数的具体使用
2019/07/29 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
python编写猜数字小游戏
2019/10/06 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
苹果音乐订阅:Apple Music
2018/08/02 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
临床医师专业个人自我评价
2014/01/08 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python
MySQL系列之三 基础篇
2021/07/02 MySQL