使用RxJS更优雅地进行定时请求详析


Posted in Javascript onJune 02, 2019

在用 Angular 做项目的时候,遇到了一个有点麻烦的问题。具体问题如下:

轮循请求某个接口,如何保证接口返回的数据与请求的顺序相同?

实际的业务场景是这样的:前端需要轮循请求后端接口获取文件处理进度,并在前端用进度条展示。如下方所示:

使用RxJS更优雅地进行定时请求详析

首先想到的肯定是使用 setTimeout 或者 setInterval 进行定时请求。然而结果有点诡异,进度条的变化不是递增,而是有快有慢,比如 30%,20%,50%,40%这样。仔细一想也知道问题出在哪,异步请求的结果并不是按顺序返回的。

我在之前的工作中还没有遇到过这类需求,所以我并不是很清楚如果用传统方式应该如何解决。然而很庆幸的是 RxJS 正好擅长处理这样的问题。我立即翻了一下文档,interval 操作符可以处理定时任务,而且更强大的是返回结果也是有顺序的。

interval(period: 0 = 0, scheduler: SchedulerLike = async): Observable<number>

首先看一下 interval 的说明:

创建一个可观察对象,在规定的调度程序中,以规定的时间间隔发出连续的数值。

使用RxJS更优雅地进行定时请求详析

interval 返回一个可观察对象,它可以周期性的发出递增数值,但是第一次发出值是在第一个周期结束之后执行的。

以下是官方例子:

import { interval } from 'rxjs';
import { take } from 'rxjs/operators';

const numbers = interval(1000);

const takeFourNumbers = numbers.pipe(take(4));

takeFourNumbers.subscribe(x => console.log('Next: ', x));

// Logs:
// Next: 0
// Next: 1
// Next: 2
// Next: 3

不过只看官方例子还是有点懵,如果是 http 请求的话应该怎么写参数呢?或者说应该把 http 请求写在哪里?

这个地方的坑有点深,通过翻阅外文资料终于找到答案。直接上代码。

// 间隔 1s 请求
this.timer$ = interval(1000)
  .pipe(
    // 取消过时的请求值
    switchMap(() => {
      return this.http.get(API);
    }),
  )
  .subscribe(
    (res: any) => {
      // 百分数处理逻辑
    },
    () => {
      this.timer$.unsubscribe();
    },
    () => {
      this.timer$.unsubscribe();
    },
  );

总的来说就是通过管道处理请求。最终的效果很完美。

总结

RxJS 确实是一个非常强大的工具库,尤其处理异步交互真的是省时省力,但是国内技术文章偏少,遇到疑难问题还需要查阅国外文章。欢迎大家评论交流。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery .tmpl(), .template()学习资料小结
Jul 18 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
js实现简单登录功能的实例代码
Nov 09 Javascript
JSON取值前判断
Dec 23 Javascript
js实现上一页下一页的效果【附代码】
Mar 10 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
May 17 Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 Javascript
一个超简单的jQuery回调函数例子(分享)
Aug 08 Javascript
jQuery validate 验证radio实例
Mar 01 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
jQuery实现影院选座订座效果
Apr 13 jQuery
Vue CLI3基础学习之pages构建多页应用
Jun 02 #Javascript
Vue基础学习之项目整合及优化
Jun 02 #Javascript
JavaScript判断对象和数组的两种方法
May 31 #Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 #Javascript
Vuex新手的理解与使用详解
May 31 #Javascript
一文快速了解JQuery中的AJAX
May 31 #jQuery
gulp构建小程序的方法步骤
May 31 #Javascript
You might like
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
php header示例代码(推荐)
2010/09/08 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
javascript的函数作用域
2014/11/12 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
深入理解vue中的$set
2017/06/01 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
python正则表达式match和search用法实例
2015/03/26 Python
Python实现分段线性插值
2018/12/17 Python
python eventlet绿化和patch原理
2020/11/21 Python
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
大学四年职业生涯规划书范文
2014/01/02 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
商务英语求职信范文
2015/03/19 职场文书
倡议书的格式写法
2015/04/28 职场文书
小学教师教学反思
2016/02/24 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers