ajax失败递归纯javascript
我尝试在ajax调用内部对自己的服务器进行两次异步ajax调用,以防外部ajax调用未成功。我得到的结果是,最后一个ajax调用实际上是从浏览器转到服务器。我不能使用回调,因为我只需要这两个ajax调用,以防第一个调用失败 主要诀窍——我不能使用jQuery,这个ajax应该是跨浏览器兼容的->IE8,9。我已经在我的服务器上测试了它,它可以跨域工作。唯一让我心碎的是,如何让这段代码在第一次调用失败时运行两个ajax调用。我不需要COMET(订阅)或WebSocketajax失败递归纯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 请帮帮我。以下是如何修改您
请帮帮我。以下是如何修改您的程序,使其按预期运行:
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);
}
}
....