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 浏览器判断实现函数
Aug 20 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
可自己添加html的伪弹出框实现代码
Sep 08 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
Dec 28 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
浅谈JavaScript中null和undefined
Jul 09 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
Oct 27 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
详解Vue使用命令行搭建单页面应用
May 24 Javascript
微信小程序之蓝牙的链接
Sep 26 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 Javascript
js实现双色球效果
Aug 02 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
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
php实现字符串翻转的方法
2015/03/27 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
django基础学习之send_mail功能
2019/08/07 Python
用python解压分析jar包实例
2020/01/16 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python中if有多个条件处理方法
2020/02/26 Python
python让函数不返回结果的方法
2020/06/22 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
python中判断文件结束符的具体方法
2020/08/04 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
2014自主招生自荐信策略
2014/01/27 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
仲裁协议书
2014/09/26 职场文书
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python