文档章节

浏览器端异步超时检测

GZShi_alpha
 GZShi_alpha
发布于 2014/06/13 15:13
字数 317
阅读 290
收藏 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
DeferredResult的使用场景及用法

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

胡桃同学
2016/12/14
26
0
Java中解决(extjs或jquery)session过期退出登录问题

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

Junn
2013/09/24
0
0
[IBM DW] Servlet 3.0 实战:异步 Servlet 与 Comet 风格应用程序

简介: 自 JSR 315 规范(即 Servlet 3.0)的草案公开发布以来,最新一代 Servlet 规范的各种新特性被越来越多的开发人员所关注。规范中提到的一系列高级目标:如可插拔的 Web 框架、便捷开发...

红薯
2010/11/28
920
4

没有更多内容

加载失败,请刷新页面

加载更多

Spring核心概念--Spring01

小生初出程序茅庐,走上编程之路,还请各位大佬多多管照。 初学Spring框架: 创建HelloWorldSpring项目 用eclipse开发Web项目,添加jar包: commons-logging-1.2.jar log4j-1.2.17.jar spring-...

小橙子的曼曼
25分钟前
1
0
MySQL 运行状态监控方法

一、通过shell脚本监控mysql的qps,tps,io详细见附件脚本《mysqlgather.sh》 因在脚本中直接设置密码会提示告警信息,需要在my.cnf文件中的[client]标签下增加默认的用户名和密码,并重启mys...

PeakFang-BOK
30分钟前
2
0
ROS实操笔记 四 topic (主题)

主题 消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,...

placido
30分钟前
1
0
【NLP】【六】gensim之doc2vec

【一】总述 doc2vec是指将句子、段落或者文章使用向量来表示,这样可以方便的计算句子、文章、段落的相似度。 【二】使用方法介绍 1. 预料准备 def read_corpus(fname, tokens_only=False):...

muqiusangyang
33分钟前
0
0
node中process.nextTick & promise & 异步IO & setTimeout & setImmediate 的优先级

process.nextTick > promise > setTimeout > 异步IO > setImmediate

小草先森
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部