2015-04-18 85 views
0
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調用,以防第一次失敗。ajax失敗遞歸純javascript

主要的竅門 - 我不能使用jQuery,這阿賈克斯應該是跨瀏覽器兼容 - > IE8,9。我已經在我的服務器上對它進行了測試,並且它與跨域一起工作。唯一的事情就是打破我的想法,如何讓這段代碼在第一次失敗時運行2個Ajax調用。我不需要COMET(訂閱)或WebSockets。

請幫我一個人。

+0

我簡化了代碼,並將所有函數放在這裏 – Justfly

回答

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你在與一個錯誤進行了更新返回請求的情況下看在錯誤的情況下。

+0

不,這沒有幫助 - 問題不是限制ajax調用 - 如果我將它限制爲100,那麼只有第二次嘗試/ cach ajax調用正在使x。狀態== 200 第一個被忽略。 – Justfly

+0

我明白,如果第一次通話失敗,計數應該很重要,如果一次成功的次數少於3次,程序應該結束。當你全部完成整個過程時,這是毫無意義的計數嘗試。 –

+0

無論如何,我不能說你在做什麼對我來說很清楚。但我希望你弄明白。歡呼聲 –