博客原文地址

使用场景

用户进行一个操作请求后台而长时间未响应,我们希望给用户一个信息展示(请求超时,网络不好…).

RxJS实现

关于RxJS请看这里

我这个功能的实现主要使用 delayrace两个操作符。
* delay 通过给定的超时或者直到一个给定的时间来延迟源 Observable 的发送。延迟时间(以毫秒为单位的数字)或 Date 对象(发送延迟到这个时间点)。
* race 返回 Observable,该 Observable 是源 Observable 和提供的 Observables 的组合中 第一个发出项的 Observable 的镜像。

具体实现过程代码(使用angualr和ionic)如下:
我封装成了service方便使用。主要看timeoutDeal方法。
service.ts

import { Injectable } from "@angular/core";
import { delay, map, race } from "rxjs/operators";
import { Observable } from "rxjs/Observable";
import { AlertController, LoadingController } from "ionic-angular";@Injectable()
export class HttpTimeoutService {loading: any;timer: any;timers:any[]=[];constructor(private loadingCtrl: LoadingController,private alertCtrl: AlertController) {}// **参数name和参数mes相同showLoading(name) {const self = this;let obj={name:name,timer:undefined,loading:undefined};const timer = setTimeout(() => {let loading = this.loadingCtrl.create();loading.present();obj.loading=loading;}, 500);obj.timer=timer;this.timers.push(obj);}clearTimer(name) {const self = this;for(let i=0;i<this.timers.length;i++){if(this.timers[i].name===name){if(this.timers[i].loading){this.timers[i].loading.dismiss();}clearTimeout(this.timers[i].timer);this.timers.splice(i,1);return;}}}timeoutDeal(mes) {const self = this;let TIME_OUT = 6000;let cancel$ = Observable.of(null).pipe(delay(TIME_OUT),map(_ => {// throw 'error';self.clearTimer(mes);self.alertCtrl.create({title: '连接超时',message: '当前网络不稳定,请寻找一个稳定网络!',buttons: ['确定']}).present();throw mes + 'timeout!'  // 重要}));return cancel$;}}

pipe是 Observable 中有一个内置的 pipe 方法 (Observable.prototype.pipe),它可以用类似于之前的链式调用的方式来组合操作符。RxJS 5.5版本之后。

使用:

...
import 'rxjs/add/operator/race';
import 'rxjs/add/operator/delay';
export class HomePage extends BasePage {...constructor(private httpTimeoutService: HttpTimeoutService,private smartSellerHomepageService: SmartSellerHomepageServiceProxy,....this.httpTimeoutService.showLoading('getFirstPageInfo');this.smartSellerHomepageService.getFirstPageInfo(moment()).race(this.httpTimeoutService.timeoutDeal('getFirstPageInfo')).subscribe(res => {this.httpTimeoutService.clearTimer('getFirstPageInfo');// console.log(res);this.firstPageInfo = res;}, error => {}, ()=>{this.httpTimeoutService.clearTimer('getFirstPageInfo'););...

```````11月28日更新````````

最近新项目中使用rxjs版本是v6以上

Observable.of的用法改了使用
import { of } from 'rxjs'
race 最好的用法:
import { race } from 'rxjs'

race($a, $b).subscribe();

转载于:https://www.cnblogs.com/stardee/p/9623055.html

rxjs处理http请求超时相关推荐

  1. HttpInterceptor 拦截器 - 网络请求超时与重试的简单实现

    ... 拦截器在Angular项目中其实有着十分重要的地位,拦截器可以统一对 HTTP 请求进行拦截处理,我们可以在每个请求体或者响应后对应的流添加一系列动作或者处理数据,再返回给使用者调用. 每个 ...

  2. SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

    在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...

  3. php 访问超时,PHP http请求超时问题解决方案

    这篇文章主要介绍了PHP http请求超时问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,http请求超时时间 可能出现的场景: 1 ...

  4. 宿主机( win 7 系统) ping 虚拟机VMware( cent os 6.6 ) 出现“请求超时”或者“无法访问目标主机”的解决方法

    宿主机( win 7 系统) ping 虚拟机VMware( cent os 6.6 ) 出现"请求超时"或者"无法访问目标主机"的解决方法 参考文章: (1) ...

  5. 解决在vue中axios请求超时的问题

    解决在vue中axios请求超时的问题 参考文章: (1)解决在vue中axios请求超时的问题 (2)https://www.cnblogs.com/zhouyangla/p/8757149.htm ...

  6. 使Git与代理服务器一起使用-因“请求超时”而失败

    如何让Git使用代理服务器? 我需要从Git服务器中检出代码,但每次都会显示"请求超时". 我该如何解决? 或者,如何设置代理服务器? #1楼 如果配置代理服务器的命令行方法不起作 ...

  7. windows或Ubuntu中请求github.com请求超时,或在下载GitHub文件出现:<urlopen error [Errno 110] Connection timed out>

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 windows或Ubuntu中请求github.com请求超时,或在下载GitHub文件出现:urlopen error ...

  8. Ajax 请求超时与网络异常

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  9. 【必看】 一篇 CPU 占用高,导致请求超时的故障排查

    一.发现问题的系统检查 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多. 二.定位故障 根据这种故障 ...

最新文章

  1. 可以获取python整数类型帮助的是什么-Python 的数值类型(整数、长整数、浮点数和复数)...
  2. Spring-常见问题25问
  3. Object Pascal 中类型
  4. [Git] 001 初识 Git 与 GitHub 之新建仓库
  5. 互联网1分钟 |1123
  6. ACM Doing Homework again
  7. 蓝桥杯 基础练习 数列排序
  8. coreos 搭建PHP,Linux_用Mac在CoreOS上搭建WordPress的教程,作者以自己的Mac笔记本为例, - phpStudy...
  9. 计算机平方在线使用,开平方计算器在线
  10. Web渗透测试学习路线图
  11. 国外网站视频下载方法通通告诉你
  12. 前端面试需要准备什么?
  13. Netron简单使用教程
  14. itext设置字体间距_微信公众号文章字体怎么修改?行间距、字间距一般设置多少?...
  15. 客服坐席聊天页面html,WebSocket实现简单客服聊天系统
  16. 圈的ramsey数研究
  17. codeforces1155F Delivery Oligopoly
  18. SVPWM的一些参数
  19. 论文写作-引言怎么写
  20. jquery $.each(data, function (index, value) { }

热门文章

  1. pandas.Series.rank用法详解
  2. final/finalize/finally的区别
  3. K3Cloud开放数据模型
  4. Wcf Rest Service模板--方法输入输出流数据
  5. DataReader类访问字段的值
  6. vscode php插件_vscode+phpstudy+xdebug无法断点(踩坑记)
  7. c语言中元音字母对应的的值,全国计算机等级考试二级C语言南开上机百题改错题第59...
  8. sublime c 语言 编译,默认情况下,将程序编译为Sublime Text 3中的c 14
  9. JavaScript学习之ES6学习之Promise
  10. 场强和电阻_电阻定律及其相关问题