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所必须要知道的一些
Mar 07 Javascript
jQuery LigerUI 使用教程入门篇
Jan 18 Javascript
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
js实现本地图片文件拖拽效果
Jul 18 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
May 04 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
Aug 09 Javascript
vue 父组件中调用子组件函数的方法
Jun 06 Javascript
Javascript幻灯片播放功能实现过程解析
May 07 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使用GD实现颜色渐变实例
2015/06/02 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
为Python的web框架编写前端模版的教程
2015/04/30 Python
python中sys.argv函数精简概括
2018/07/08 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
python中get和post有什么区别
2020/06/19 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
python 录制系统声音的示例
2020/12/21 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
运动会广播稿150字
2014/02/19 职场文书
经典促销广告词大全
2014/03/19 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
酒店员工管理制度
2015/08/05 职场文书
企业法人任命书
2015/09/21 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书