博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浏览器端异步超时检测
阅读量:5833 次
发布时间:2019-06-18

本文共 1234 字,大约阅读时间需要 4 分钟。

hot3.png

在写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});

转载于:https://my.oschina.net/u/1454562/blog/279457

你可能感兴趣的文章
构建Docker Compose服务堆栈
查看>>
最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
查看>>
Hadoop生态圈-Kafka常用命令总结
查看>>
如何基于Redis Replication设计并实现Redis-replicator?
查看>>
浮点数内存如何存储的
查看>>
贪吃蛇
查看>>
EventSystem
查看>>
用WINSOCK API实现同步非阻塞方式的网络通讯
查看>>
玩一玩博客,嘿嘿
查看>>
P1352 没有上司的舞会
查看>>
ios11文件夹
查看>>
【HLOJ 559】好朋友的题
查看>>
Electric Fence(皮克定理)
查看>>
nvl 在mysql中如何处理
查看>>
MyEclipse 快捷键
查看>>
快速傅里叶变换FFT
查看>>
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>
hibernate保存失败
查看>>
MySQL增量订阅&消费组件Canal POC
查看>>