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 相关文章推荐
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
Feb 13 Javascript
Angularjs 自定义服务的三种方式(推荐)
Aug 02 Javascript
浅谈ECMAScript6新特性之let、const
Aug 02 Javascript
WebPack配置vue多页面的技巧
May 15 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
基于vue手写tree插件的那点事儿
Aug 20 Javascript
vue中 数字相加为字串转化为数值的例子
Nov 07 Javascript
JavaScript实现英语单词题库
Dec 24 Javascript
详解js中的原型,原型对象,原型链
Jul 16 Javascript
通过实例解析json与jsonp原理及使用方法
Sep 27 Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 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
基于mysql的bbs设计(二)
2006/10/09 PHP
php SQL防注入代码集合
2008/04/25 PHP
FleaPHP的安全设置方法
2008/09/15 PHP
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
json 实例详细说明教程
2009/10/31 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
Python调用C++程序的方法详解
2017/01/24 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
django 环境变量配置过程详解
2019/08/06 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
2020/08/05 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
即兴演讲稿
2014/01/04 职场文书
新学期班主任寄语
2014/01/18 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
现实表现证明材料
2015/06/19 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android