`
心动音符
  • 浏览: 337022 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
为HTTP请求设置时间限制

当XMLHttpRequest请求没有成功时,在指定的时间段后显示有帮助的信息。

XMLHttpRequest对象会打开一组异常,这些异常是连接服务器失败时由JavaScript程序产生的。为什么会发生?网络延迟可能是问题所在,或者服务器出现了错误。你并不知道你的用户连接得有多快,服务器端程序也可能因为处理大量同步请求而陷于停滞,甚至完全中断。无论如何,作为一个开发者,你希望控制用户等待多长的时间来获得应用的响应。就我们所知,用户不愿意等待太长时间,超过几秒钟通常被认为是不可接受的。

本hack在显示友好的信息给用户前花10秒钟等待服务器响应。

提示:如果你愿意,可以是5秒或更少,或者60秒。最大可容忍的等待时间依赖于你的应用场景、你的用户测试结果,以及其他因素。例如,比起依赖于应用并对其投入大量时间的局域网用户,一个普通的公众客户可能更希望一个活跃的应用,不愿意花时间等待。

本hack使用顶层window对象的名为setTimeout()的JavaScript方法。

提示:感谢Joshua Gitlin及他在http://www.xml.com/ pub/a/2005/05/11/ajax-error.html所发表的文章,它给本技术提供了很好的提示。

你可以不需要在前面冠以window对象而使用window对象的方法。换句话说,只使用setTimeout()和使用window.setTimeout()一样能正常工作。

setTimeout()接收一个函数名或者函数体作为第一个参数,另一个参数是调用方法前要等待的毫秒数(千分之一秒)。它返回一个数字值,这个数字值能用于取消函数调用。待会儿将会为你展示这些;同时,这里有段代码http_request.js,它封装了XMLHttpRequest对象的初始化以及用法。(“使用自己的库封装XMLHttpRequest”[Hack #3]可见更完整的解释。)
下面就是代码,重新改进以包含setTimeout()和一个新函数timesUp():

var request = null;

var timeoutId;

/* request对象的封装函数。

 参数:

  reqType: HTTP请求类型,如GET 或 POST。

  url: 服务器端程序的URL

  asynch: 是否异步发送请求

  respHandle: 处理响应的函数名

  arguments[4]所代表的第5个参数是POST请求要发送的数据

  */

function httpRequest(reqType,url,asynch,respHandle){

    //基于Mozilla的浏览器

    if(window.XMLHttpRequest){

        request = new XMLHttpRequest();

    } else if (window.ActiveXObject){

        request=new ActiveXObject("Msxml2.XMLHTTP");

        if (! request){

            request=new ActiveXObject("Microsoft.XMLHTTP");

        }

}

//如果ActiveXObject没有被初始化,我们会测试到一个null的request

    if(request) {

        //如果请求类型是POST,那么第5个参数是被发送的数据

        if(reqType.toLowerCase() != "post") {

            initReq(reqType,url,asynch,respHandle);

        } else {

            //被发送的数据

            var args = arguments[4];

            if(args != null && args.length > 0){

                initReq(reqType,url,asynch,respHandle,args);

            }

        }

    } else {

        alert("Your browser does not permit the use of all "+

              "of this application's features!");

    }

}

/*初始化已经构造的request对象 */

function initReq(reqType,url,bool,respHandle){

    try{

        /*指定处理HTTP响应的函数 */

        request.onreadystatechange=respHandle;

        request.open(reqType,url,bool);

        timeoutId = setTimeout(timesUp,10000);

        //如果请求类型是POST,那么第5个参数是被发送的数据

        if(reqType.toLowerCase() == "post") {

            request.setRequestHeader("Content-Type",

                    "application/x-www-form-urlencoded; charset=UTF-8");

            request.send(arguments[4]);

        } else {

            request.send(null);

        }

    } catch (errv) {

        alert(

                "The application cannot contact "+

                "the server at the moment. "+

                "Please try again in a few seconds.\n"+

                "Error detail: "+errv.message);

    }

}

function timesUp(){

//见下...

request.open()方法为发起一个HTTP连接准备了XMLHttpRequest对象。然后代码在请求被发送之前调用setTimeout()。下面是余下的代码:

/* XMLHttpRequest的事件处理器;这个函数并不是

http_request.js的一部分,但是将被定义在另一个使用

http_request.js的代码文件里,就像在

httpRequest("GET",url,true,handleReq)一样 */

function handleReq(){

    if(request.readyState == 4){

        //timeoutId 在http_request.js中声明

        //但在这儿能作为一个全局变量引用

        clearTimeout(timeoutId);

            if(request.status == 200){

                //做些有趣的事...

            }

    }//结束外部的if

}

function timesUp(){

    request.abort();

    alert("A problem occurred with communicating with "+

          "the server program. Please make sure you are connected "+

          "to the Internet and try again in a few moments.");

}


回想一下 setTimeout()每隔10秒钟调用一次timesUp()函数。如果过了10秒钟,request.readyState ==4没有返回true(代表HTTP请求完成),那么清除时限(timeout),timesUp()中止请求并显示一个alert窗口给用户。这个动作停止了请求;用户不得不重新启动和应用的交互以发起另一个请求。

提示:如果你想将时限设为3秒,例如,安装代码看起来如下:

timeoutId = setTimeout(timesUp,3000);

如果HTTP请求无故障地成功完成,代码将前面提到的timeoutId作为参数来调用clearTimeout()。这个动作立即取消了timesUp()的调用,让应用程序继续执行,做它想做的工作。

分享到:
评论

相关推荐

    cpp-并行执行http请求支持超时设置

    本主题聚焦于"cpp-并行执行http请求支持超时设置",这涉及到并发处理、HTTP协议以及时间管理等核心概念。 首先,"并行执行http请求"指的是同时发起多个HTTP请求,以提高程序的执行效率。在多核处理器和现代操作系统...

    nodejs发送http请求时遇到404长时间未响应的解决方法.docx

    在上面的代码中,我们使用了 XMLHttpRequest 对象来发送 HTTP 请求,并设置了 timeout 属性来限制请求时长。这样,Node.js 就不会继续请求下去,即使遇到 404 响应。 另一种解决方法是使用 Node.js 的 http 模块,...

    Go-gohttp支持异步请求的Go的HTTP客户端

    在Go语言中,HTTP客户端是进行网络通信的重要组成部分,它允许我们向远程服务器发送HTTP请求并接收响应。Go的标准库`net/http`提供了强大的HTTP客户端功能,但有时我们需要更高级的功能,例如异步请求处理。这里我们...

    c# http协议,实现get或post发送请求 并返回内容

    在C#中,我们可以使用`System.Net.Http`命名空间中的HttpClient类来处理HTTP请求。以下是如何使用HttpClient发送GET和POST请求的示例: **GET请求示例:** ```csharp using System.Net.Http; using System....

    修改IE的HTTP等待时间

    为了解决上述问题,可以通过修改Windows注册表中的相应设置来延长IE浏览器的HTTP请求超时时间。下面将详细介绍具体的步骤: 1. **暂时禁用防火墙和杀毒软件** - 如果计算机上已安装了防火墙或杀毒软件,这些安全...

    微信小程序 请求 封装, promise, 请求并发限制, 排队请求, ...wx-request-master.zip

    1. **微信小程序的网络请求接口**:微信小程序提供了`wx.request()`接口来执行HTTP请求,它允许开发者向服务器获取数据,如JSON、图片等。使用`wx.request()`时,需要提供URL、请求方法(GET或POST)以及数据等参数...

    http请求options预请求的demo

    回到我们的示例,"http请求options测试"可能包含了一个前端项目和一个后端接口,用于演示如何设置CORS策略以及OPTIONS预请求的工作流程。前端部分可能创建了一个跨域请求,而后端部分则配置了相应的响应头以允许这个...

    Http请求长时间等待无结果返回解决办法

    总之,对于HTTP请求长时间等待无结果返回的问题,关键在于合理设置请求超时,并且在超时时能正确处理异常,避免进程阻塞。同时,与服务提供商保持良好的沟通,共同排查和解决可能存在的服务器端问题,是预防此类问题...

    Android-OkHttp的请求重试拦截器

    5. **超时控制**:为整个请求加上超时限制,如果在设定时间内未收到响应,则终止请求,不再重试。 在代码实现上,我们可以创建一个自定义的`Interceptor`类,重写`intercept(Chain chain)`方法。在该方法中,我们...

    HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。

    然而,在这种特定情况下,“请求筛选模块被配置为拒绝超过请求内容长度的请求”,这意味着服务器上的安全策略或配置阻止了请求的处理,因为请求的数据量超过了预先设定的限制。 #### 二、原因分析 这类错误通常...

    cxf超时设置

    当这个时间限制到达而操作仍未完成,系统会认为该操作失败并采取相应措施,比如重试或抛出异常。在网络通信中,超时设置尤为重要,因为网络延迟、服务器负载或网络故障可能导致请求无法及时响应。 在CXF中,超时...

    Android 实现Http请求响应

    首先,Android系统为了防止主线程被长时间的网络操作阻塞,引入了异步任务和网络访问的限制。因此,我们通常会在后台线程执行Http请求,而主线程负责展示数据。这可以通过使用`AsyncTask`,`Thread`+`Handler`,或者...

    03-HTTP请求流程:为什么很多站点第二次打开速度会很快?_For_vip_user_0011

    在本文中,我们将探讨HTTP请求流程,特别是为什么很多网站第二次打开时速度会更快,以及用户登录后再次访问站点时如何保持登录状态。HTTP协议是建立在TCP连接基础之上的,用于浏览器向服务器获取各种资源,如HTML、...

    使用图片地图减少HTTP请求

    如果一个网页中包含大量独立的图像资源,那么这将导致大量的HTTP请求,延长页面加载时间。因此,通过合并多个小图像为一张大图,然后使用图片地图可以显著减少HTTP请求的数量。 HTML的`<img>`标签常用于在网页中...

    如何设置一定时间内只能发送一次请求

    这个示例中的限制仅在前端实现,意味着用户可以通过禁用JavaScript或者直接发送HTTP请求来绕过这个限制。为了增强安全性,通常需要在服务器端也进行验证。例如,可以使用Session或Cookie来记录最近的请求时间,当新...

    HttpProxy请求工具

    1. **请求构造**:允许用户自定义HTTP请求的各个部分,包括URL、HTTP方法(Post或Get)、请求头、以及POST请求的数据。 2. **代理设置**:HttpProxy工具可能支持配置HTTP代理服务器,使得用户可以通过代理服务器...

    springboot-keepalive设置测试

    `connection-timeout`属性定义了服务器等待客户端发送请求数据的时间,而`max-http-header-size`则限制了单个HTTP请求头的最大大小。对于keepalive,我们需要关注`keep-alive-timeout`属性,它设定了在服务器关闭...

    Python-Python的HTTP请求

    - **设置超时**:限制请求等待时间。 ```python response = requests.get('http://example.com', timeout=5) ``` - **携带Cookie**:在请求中附带Cookie信息。 ```python cookies = dict(cookies_are='working') ...

    BootstrapTable请求数据时设置超时(timeout)的方法

    为了解决这个问题,BootstrapTable 提供了设置超时(timeout)的功能,使得在请求数据时可以设定一个等待限制,超过这个限制就认为请求失败,并进行相应的处理。 当使用 BootstrapTable 获取数据时,通常会通过 ...

Global site tag (gtag.js) - Google Analytics