zoukankan      html  css  js  c++  java
  • 检查超时Ajax之四

    有时发出一个请求,后端什么时候返回前端并不清楚。有可能是1秒,3秒甚至更长时间。因此有必要添加一个参数来设置等待的时间,如果在设定的时间内没有返回结果则放弃该次请求。

    实现思路:发出请求后指定一个时间,如超过该时间没有返回结果则忽略。window对象的setTimeout方法再次起作用了(setTimeout能解决很多IE下古怪的bug)

    代码如下:

    var timeout = opt.timeout || 0;//指定是否启用请求超时处理,不传参数timeout则忽略
    
    var isTimeout = false; //一个标志位,是否超时
    
    if(timeout>0){
    	setTimeout(function(){
    		isTimeout = true;
    	},timeout);
    }
    
    //最后将isTimeout用在onreadystatechange处理中
    xhr.onreadystatechange = function(){
    	if (xhr.readyState == 4 && !isTimeout){//当请求完成,且没有超时才处理结果
    		_onStateChange(xhr, type, success, failure);
    	}else{}
    };
    

    调用如下

    Ajax.text('../servlet/Ajax',{
    	timeout : 2000,
    	success : function(){},
    	failure : function(){}
    });
    

    后台我用servlet,直接sleep下即可模拟超时(sleep时间3000大于timeout的设置2000)

    try {
    	Thread.sleep(3000);
    } catch (InterruptedException e) {
    	e.printStackTrace();
    }
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("request success");
    out.flush();
    out.close();
    

     
    请求超时后,success/failure都不会被调用。这样处理有一定的合理性,但缺陷也显而易见,用户不知是超时了还是其它什么错误。下一篇将有所改进。

    相关:

    ajax_04.zip

    https://github.com/snandy/io

  • 相关阅读:
    ASP.NET 2.0 中改进的缓存功能
    Python 一门神奇的语言
    showModalDialog()、showModelessDialog()方法使用详解
    在VS2005中 GridView导入Excel的两点小技巧附源码
    DVB码流中业务信息与电子节目指南
    js 日历控件
    js收藏
    什么是ECM,EMM,AU,EMU?
    精解PSISI(一)
    Oracle第四课(学习笔记)
  • 原文地址:https://www.cnblogs.com/snandy/p/2026680.html
Copyright © 2011-2022 走看看