ajax失败递归纯javascript

时间:2015-04-18 21:41:46

标签: javascript ajax recursion xmlhttprequest cross-domain

var object = {
    ver: "version",
    time: "time",
    xhr: new XMLHttpRequest(),
    method: "POST",
    error: JSON.stringify({
        api: object.ver,
        err: "server",
        time: object.time
    });
},
servers = {
    srv1:"http://srv1.example.com",
    srv2:"http://srv2.example.com",
    srvErr:"http://err.example.com"
},
data = JSON.stringify({
    api: object.ver,
    time: object.time
});

function cors(object, server) { // Cross domain XHR request
    if ("withCredentials" in object.xhr) {
        object.xhr.open(object.method, server, true);
    } else if (typeof XDomainRequest != "undefined") {
        object.xhr = new XDomainRequest();
        object.xhr.open(object.method, server);
    } else {
        object.xhr = null;
    }
    return object.xhr;
}
function ajax(data, object, server, servers) {;
    try {
        var x = cors(object, server);
        x.setRequestHeader("Content-Type","application/json;charset=UTF-8", 'X-Requested-With', 'XMLHttpRequest');
        x.onreadystatechange = function() {
            if (x.readyState != 4) {
                return;
            }
            if(x.status==200){
                console.log("success: ", data);
            }
            n++;
            if (x.status != 200) {
                console.log("2", data);

                ajax(data, object, servers.srv2, server);
                //second call

                ajax(object.error, object, servers.srvErr, servers);
                //third call
            }
        };
        x.send(data);
    } catch (e) {
        console.log(e.message);
    }
}
ajax(data, object, servers.srv1, servers); // first call

我尝试在ajax调用我自己的服务器中进行两次异步ajax调用,以防外部ajax调用没有成功。我得到的结果是,只有最后一次ajax调用才真正从浏览器到服务器。我不能使用回调,因为我只需要这两个ajax调用,以防第一个失败。

主要技巧 - 我不能使用jQuery,这个ajax应该是跨浏览器兼容的 - > IE8,9。我已经在我的服务器上测试了它,它适用于跨域。唯一让我心烦意乱的是,如何让这个代码在第一个失败时运行2个ajax调用。我不需要COMET(订阅)或WebSockets。

请帮助我。

1 个答案:

答案 0 :(得分:0)

以下是如何根据您的预期修改您的程序:

...
if (x.status != 200) {
    console.log("t2", d, "N: ", n);

    // I SUPPOSE HERE'S THE RIGHT PLACE TO INCREMENT YOUR COUNTER
    n++;

    try {
        f(d); // throw error with data json
    } catch (e) {
        a(e.message, p, r.t1, r, n);
    }
    try {
        e(p, s, r); // throw error with error json
    } catch (e) {
        a(e.message, p, r.err, r, n);
    }
}
....

您目前遇到意外行为,因为您在错误返回的请求中看到的n已在错误的上下文中更新。