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。
请帮助我。
答案 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
已在错误的上下文中更新。