• 构造可重用的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上只有第一次调用成功执行,其他都会失败

  • 相关阅读:
    jUploadr:上传图片到 Flickr
    Openbox 3.3
    TightVNC-长途节制软件
    Ion:分页式的窗口操持器
    MOC-节制台音乐播放器
    计算机软件资格考试网站
    WinAPI 字符及字符串函数(2): CharLowerBuff 把缓冲区中指定数目的字符转小写
    WinAPI: 输入光标相关的函数[4]
    一个字符串到数组的例子 回复"成红"的问题, 对其他朋友参考价值不大
    多媒体函数简介
  • 原文地址:https://www.cnblogs.com/mackxu/p/2827204.html
Copyright © 2020-2023  润新知