zoukankan      html  css  js  c++  java
  • 构造可重用的Ajax对象

    可重用类:

     1 function Ajax() {
     2     var oXhr = null;
     3     var msxml_progid = [
     4         'MSXML2.XMLHTTP.6.0',
     5         'MSXML3.XMLHTTP',
     6         'Microsoft.XMLHTTP',
     7         'MSXML2.XMLHTTP.3.0'
     8     ];
     9     try{
    10         oXhr = new XMLHttpRequest();            //先尝试标准方法
    11     }catch(e) {
    12         for(var i=0, len=msxml_progid.length; i<len; i++) {
    13             try{
    14                 oXhr = new ActiveXObject(msxml_progid[i]);
    15                 break;
    16             }catch(e2) {}
    17         }
    18     }finally {
    19         if(!oXhr) return;
    20     }
    21     this.oXhr = oXhr;
    22 }
    23 Ajax.prototype.get(url, options) {
    24     if(this.oXhr) {
    25         var oXhr = this.oXhr;
    26         var aborted = false;        //请求是否被取消
    27         //默认参数
    28         var _options = {
    29             method: 'GET',
    30             timeout: 5,                //s为单位
    31             onerror: function() {},
    32             onsuccess: function() {}
    33         };
    34         //覆盖各个选项
    35         for(var key in options) {
    36             _options[key] = options[key];
    37         }
    38         function checkForTimeout() {
    39             if(oXhr.readyState != 4) {
    40                 aborted = true;
    41                 oXhr.abort();
    42             }
    43         }
    44         //超时调用函数取消请求
    45         setTimeout(checkForTimeout, _options.timeout * 1000);
    46         function onreadystateCallback() {
    47             if(oXhr.readyState == 4) {
    48                 if(!aborted && oXhr.status>=200 && oXhr.status<=300) {
    49                     _options.onsuccess(oXhr);
    50                 }else {
    51                     _options.onerror(oXhr);
    52                 }
    53             }
    54         }
    55         oXhr.open(_options.method, url, true);
    56         oXhr.onreadystatechange = onreadystateCallback;
    57         oXhr.send();
    58     }
    59 };

    为失败做准备

    • 如果请求超时会发生什么事?应该等待多长时间

    解决办法:等待一段时间后调用超时,并处理超时错误。

    • 如果取回的数据与预期不符怎么办

    应在服务器端设置应急方案,在结果里返回某种错误代码。客户端接收数据后,先有无检查错误代码。

    这是处理JSON数据格式的情况:

    {“error”:{“id”:1, “message”:”Your session has ,,,”}}
    var UNKNOWN = 0;
    function processRequestSuccess(oXhr) {
        var obj = oXhr.responseText.parseJSON();
        if(!obj) {
            processError(UNKNOWN);
        }else if(obj.error) {
            processError(obj.error.id, obj.error.message);
        }else {
            //按照正常情况继续处理请求
            //...
        }
    }
    • 如果发出了多个请求会发生什么事?(尤其是在响应返回的顺序和请求发生的顺序不一致的情况下!)

    在web应用中,多重请求是司空见惯的。

    1)  第一次请求已经发出,而后续的请求应该覆盖掉第一次请求。

    2)  连续发出了多个请求,但调用返回的顺序是不定的。 (用一个令牌来跟踪每次调用)

    如果打算重用这个Ajax对象,让它发送多个请求,那么必须在open调用之后声明onreadystatechange事件,否者IE5/6上只有第一次调用成功执行,其他都会失败

  • 相关阅读:
    GDI绘制时钟效果,与系统时间保持同步,基于Winform
    Asp.Net Core API网关Ocelot
    Docker打包 Asp.Net Core应用,在CentOS上运行
    【C#】数据库脚本生成工具(二)
    【C#附源码】数据库文档生成工具支持(Excel+Htm)
    微信小程序初使心得【微信小程序快速入门】
    论:开发者信仰之“天下IT是一家“(Java .NET篇)
    线程池,千万注意,原来很多人都在错用
    .NET跨平台之运行与Linux上的Jexus服务器
    StackExchange.Redis 之 SortedSet 类型示例
  • 原文地址:https://www.cnblogs.com/mackxu/p/2827204.html
Copyright © 2011-2022 走看看