文档章节

浏览器端异步超时检测

GZShi_alpha
 GZShi_alpha
发布于 2014/06/13 15:13
字数 317
阅读 287
收藏 8

在写JavaScript代码的时候,异步回调是一个非常常见的特征。完善的回调会有和超时相关的设置,例如Ajax的timeout选项。那如果SDK提供的异步调用函数中没有提供超时设置,在出现异常的时候就只能干等了吗?这当然是不能忍的。

我们先构造一个没有提供超时设置的回调函数:

function myTimeout(options) {
  options = options || {};
  setTimeout(function () {
    options.callback("called!");
  }, 5000);
}

上面的代码很简单,5秒后回调送进去的回调函数。如果我们要为这个异步回调提供超时设置,例如3秒钟超时,那么该怎么弄呢?

(function () {

var oldMyTimeout = myTimeout;
myTimeout = function (options) {
  var timeoutFlag = false;
  var timeoutHandle = -1;
  var timeout = options.timeout;
  var callback = options.callback;
  var hookCallback = function () {
    if(timeoutFlag == true) return;        // 检测到超时,不再执行后面的实际回调函数
    clearTimeout(timeoutHandle);           // 清空超时控制器
    return callback.apply(this, Array.prototype.slice.call(arguments));  //调用原始的回调函数
  }
  options.callback = hookCallback;
  
  if(timeout > 0) {  // 超时设置小于0时,不进行超时检测
    timeoutHandle = setTimeout(function() {
      timeoutFlag = true;
      callback("已经超时(" + timeout + "ms)");
    }, timeout);
  }
  oldMyTimeout(options);
}

})();

可以用下面代码进行测试:

// called!
myTimeout({
  callback: function (data) {console.log(data);},
  timeout: 6000
});

// 已经超时(4000ms)
myTimeout({
  callback: function (data) {console.log(data);},
  timeout: 4000
});


© 著作权归作者所有

共有 人打赏支持
GZShi_alpha

GZShi_alpha

粉丝 4
博文 5
码字总数 2709
作品 0
武汉
RPC-非阻塞通信下的同步API实现原理,以Dubbo为例

Netty在Java NIO领域基本算是独占鳌头,涉及到高性能网络通信,基本都会以Netty为底层通信框架,Dubbo 也不例外。以下将以Dubbo实现为例介绍其是如何在NIO非阻塞通信基础上实现同步通信的。 ...

echov
01/14
2
0
dubbo剖析:七 网络通信总结

注:文章中使用的dubbo源码版本为2.5.4 零、文章目录 Dubbo的网络分层抽象 Dubbo如何保证Client端与Server端的连通性 Dubbo的请求响应模式,如何将异步IO变为同步RPC Dubbo线程模型总结 一、...

益文的圈
05/13
0
0
Java中解决(extjs或jquery)session过期退出登录问题

解决两种情况下的用户访问超时: a)普通http请求的session超时; b)异步http请求的session超时,如果使用extjs后大部分的界面刷新都是异步的ajax请求。 不管是那种类型的http请求总是可以由...

Junn
2013/09/24
0
0
ZooKeeper源码研究系列 客户端创建连接过程分析

1 系列目录 ZooKeeper源码研究系列(1)源码环境搭建 ZooKeeper源码研究系列(2)客户端创建连接过程分析 ZooKeeper源码研究系列(3)单机版服务器介绍 ZooKeeper源码研究系列(4)集群版服务...

小萝卜_
2016/07/26
56
0
DeferredResult的使用场景及用法

假设我们现在要实现这样一个功能:浏览器要实时展示服务端计算出来的数据。 一种可能的实现是:浏览器频繁(例如定时1秒)向服务端发起请求以获得服务端数据。但定时请求并不能“实时”反应服...

胡桃同学
2016/12/14
26
0

没有更多内容

加载失败,请刷新页面

加载更多

ehlib 修改 使行号字体颜色 与标题字体颜色 一致

对ehlib 显示效果不够满意,而做的调整 修改这个过程:procedure TCustomDBGridEh.DrawIndicatorCell(ACol, ARow: Longint; AreaCol, AreaRow: Longint; ARect: TRect; AState: TGri......

vga
25分钟前
0
0
Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
17
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部