2012-10-03 121 views
2

我用下面的代碼有這樣多的Ajax請求:jQuery的AJAX多次調用

要求1日開始 |要求1結束 |要求2開始 |要求2完成 | ...

這是代碼:

var startingpoint = fireRequest(1); 
    $.each(types,function(ix,type) 
    { 
     startingpoint = startingpoint.pipe(function() 
     { 
      alert(startingpoint.status); // undefined 
      return fireRequest(type); 
     }); 
    }); 

fireRequest只是一個switchcase到正確的AJAX函數返回$阿賈克斯(...)

我想的鏈當一個請求失敗時停止。我開始實施它,並作爲一個測試,我想提醒ajax對象的狀態,但它顯示'未定義'。我如何獲得狀態?

+0

這聽起來可能很愚蠢,但爲什麼不把你的AJAX調用設置爲'async:false'(在AJAX中撤銷A)呢?或者我把你的問題弄錯了? – m90

+0

如果我把'Async:false',它確實會和這裏的行爲一樣,但是當1失敗時我該如何停止請求?我覺得我的問題中的代碼更多地處於正確的軌道 – PoeHaH

+0

您可以簡單地擁有一個包含您只需逐個處理的請求的數組。如果成功,你繼續下一個項目,如果通話失敗,你會中斷。儘管如此,非同步AJAX是毫無意義的,我同意。你有沒有看過* $。當*還沒有? – m90

回答

1

你試圖實現的行爲已經是.pipe()方法的行爲。這需要兩個回調作爲參數,只會執行完成回調,並沿鏈,若繼續先前的請求成功,這可以在以下jsfiddle中說明: http://jsfiddle.net/dflor003/Vq2YF/(注意:在內置JSON.stringify支持和console.log支持的瀏覽器中打開此項)

如果您確實想要檢查請求的狀態,它會將狀態作爲第二個參數完成的回調。更詳細的信息可以在jQuery的API文檔站點上找到:http://api.jquery.com/deferred.pipe/

+0

BAM!回答了我想要的問題和一個可行的例子。非常感謝! – PoeHaH

+0

沒問題=)祝你好運! – DanilF

0

JS例1

這個代碼假定要中止其他請求如果任何一個請求失敗(通過404或500響應,或超時),並且不需要以評估數據響應以確定業務邏輯故障場景。 $.when()

的方法將解決其主一旦延遲,因爲所有 Deferreds決心,或拒絕只要 Deferreds之一被拒絕延期的主人。

$.when(fireRequest(1), fireRequest(2),fireRequest(3)) 
    .then(myAllSuccessfulFunc, oneFailedFunc); 

function myAllSuccesfulFunc(req1,req2,req3){ 
//everything returned a 200. 
    alert("these are not the droids you are looking for"); 
}; 
function oneFailedFunc(req1,req2,req3){ 
    //* each req looks like [ "not success", statusText, jqXHR ] */ 
//feel free to check what failed, but I don't know what you need 

    req1[2].abort(); 
    req2[2].abort(); 
    req3[2].abort(); 
}; 

JS例如2

你真正需要分析在響應數據請求成功,看看你失敗了,因爲從後端邏輯的其他請求。

var stop = 4; 
//if you are sure fireRequest(x) returns a good promise object, do this: 
callNext(fireRequest(1),1); 

function callNext(promise, currentIndex){ 
    promise.done(function(ajaxArgs){ 
    var jqXHR = ajaxArgs[2]; 
//replace this with some logic check that makes sense to your app 
    if(/error/.test(jqXHR.responseText)){ 
    //do something 
    }else if(currentIndex <stop){ 
    callNext(fireRequest(currentIndex+1),currentIndex+1); 
    }).fail(function(ajaxArgs){ 
    //server returned a 404, or a 500, or something not a success. 
    }); 
}; 
+0

請注意,例2同步調用ajax。 – DefyGravity

0

我認爲這個問題是$.Deferred和喜歡是專爲處理異步和同步程序,所以你將永遠必須以某種方式欺騙他們,如果你想要讓他們採取行動你所描述的方式。

如果你想/需要一個接一個地處理你的呼叫(使用 A JAX)我建議把它們放入一個數組,並使用一個簡單的遞歸函數來遍歷該數組,直到所有的調用完成或其中一個失敗了。

這基本上是一樣工作:

var requests = [ 
    { 
    url : '/serviceA' 
    data : myParams4ServiceA 
    }, 
    ... 
    { 
    url : '/serviceZ' 
    data : myParams4ServiceZ 
    } 
]; 

現在你有AJAX的Array要求,你可以建立一個遞歸函數將通過逐一工作:

function work(){ 

$.ajax(requests[0]).done(function(data){ 
    //handle data here 
    requests.shift(); //request is done and can be removed from the Array, request[0] will now be the next request in the queue 

    if (requests.length){ 
    work(); //function calls itself again if there's still need for it 
    } else { 
    // we are done! 
    } 

}).fail(function(e){ 
    //call failed -> handle error 
}); 

} 

work(); 

this fiddle爲成功鏈的一個例子,並且this one對於失敗的鏈。

另一種可能性是將AJAX調用設置爲async : false(請注意,這在jQuery 1.8+中已棄用:「從jQuery 1開始。8,不贊成使用帶有jqXHR($ .Deferred)的async:false;您必須使用完整/成功/錯誤回調。「,這是指向我們回來了),並用它,您對像的請求陣列簡單$.when().then().fail()鏈:

$.when.apply($, requests).then(function(){ 

    $.each(arguments, function(){ 
     //do stuff with your data 
    }); 

}).fail(function(){ 

    //handle the error 

}); 

當你的呼叫現在阻止這也將處理他們排成一排見a fiddle對於這一點。