Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ajax失败递归纯javascript_Javascript_Ajax_Recursion_Xmlhttprequest_Cross Domain - Fatal编程技术网

ajax失败递归纯javascript

ajax失败递归纯javascript,javascript,ajax,recursion,xmlhttprequest,cross-domain,Javascript,Ajax,Recursion,Xmlhttprequest,Cross Domain,我尝试在ajax调用内部对自己的服务器进行两次异步ajax调用,以防外部ajax调用未成功。我得到的结果是,最后一个ajax调用实际上是从浏览器转到服务器。我不能使用回调,因为我只需要这两个ajax调用,以防第一个调用失败 主要诀窍——我不能使用jQuery,这个ajax应该是跨浏览器兼容的->IE8,9。我已经在我的服务器上测试了它,它可以跨域工作。唯一让我心碎的是,如何让这段代码在第一次调用失败时运行两个ajax调用。我不需要COMET(订阅)或WebSocket 请帮帮我。以下是如何修改您

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

主要诀窍——我不能使用jQuery,这个ajax应该是跨浏览器兼容的->IE8,9。我已经在我的服务器上测试了它,它可以跨域工作。唯一让我心碎的是,如何让这段代码在第一次调用失败时运行两个ajax调用。我不需要COMET(订阅)或WebSocket


请帮帮我。

以下是如何修改您的程序,使其按预期运行:

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

您当前遇到了一个意外行为,因为您在返回错误的请求时看到的
n
是在错误的上下文中更新的。

不,这没有帮助-问题不是限制ajax调用-如果我将其限制为100,只有第二次try/cach ajax调用正在进行x.status==200忽略第一次调用。我理解如果第一次调用失败,计数应该很重要,并且如果在不到3次尝试中成功一次,则过程应该结束。当你把整个过程都做完的时候,数数尝试是没有意义的。无论如何,我不能说你在做什么对我来说是很清楚的。但我希望你能弄明白。Cheers共有3台服务器发送呼叫-第一个默认、第二个备用和第三个错误通知。每次默认和备用ajax调用失败时,我都需要调用错误通知服务器。因此,最多有4个调用—1个默认调用、1个备用调用和2个错误调用。我不需要在第四个之后运行leep callc,所以这是一个限制计数器函数。问题是fail Block中有两个ajax调用。您能更详细地描述上述问题吗?我简化了代码并将所有函数放在这里
...
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);
    }
}
....