2017-05-31 166 views
0

以下按順序使用jQuery執行每個ajax調用。通話必須按順序進行。我發現這個工作的唯一方法是使用異步:false,我知道這是棄用的,不應該使用。下面的代碼遍歷[name]數組中的每個元素並按順序觸發每個ajax請求。當我刪除async:false時,ajax調用會失序,有時其中一個似乎根本不會觸發。我認爲ajaxComplete可能會幫助我,但我沒有運氣。有沒有辦法讓這些Ajax調用順序觸發?JQuery - 強制多個ajax請求按順序運行

function doGetJson(name1) { 
    var URL = 'http://some url/?name=' + name1; 
    $.ajax({ 
     url : URL, 
     dataType : 'jsonp', 
     async: false, 
     jsonpCallback : 'getJson', 
     name: name1, 
     index: i, 
     success : handleJson 
    }); 
}; 

function handleJson(data) { 
    <...some other operations...> 

}; 

var name = "test1,test2,test3".split(","); 

for (var i = 0; i < name.length ; i++) 
{ 
    doGetJson(name[i]); 
} 
+0

是否有你需要按順序Ajax調用理由嗎? – ErikusMaximus

+0

每個ajax調用的結果都是一個地圖圖層,它必須以特定順序添加到地圖中。 – firsttube

回答

0

您應該使用承諾。首先讓你的函數返回$.ajax像這樣:

function doGetJson(name1) { 
    var URL = 'http://some url/?name=' + name1; 

    // notice the return !!! 
    return $.ajax({ 
     url : URL, 
     dataType : 'jsonp', 
     async: false, 
     jsonpCallback : 'getJson', 
     name: name1, 
     index: i, 
     success : handleJson 
    }); 
}; 

然後你把它們連這樣的:

var name = "test1,test2,test3".split(","); 

var promise = name.slice(1) 
    .reduce((a,b) => a.then(doGetJson.bind(null, b)) 
     , doGetJson(name[0])) 

promise.then(function(){ 
    // do something when all requests are ready 
}) 
+0

感謝您的回覆。我似乎已經通過用唯一的回調名稱替換對回調函數getJson的引用來解決此問題。我使用「名稱1」代替getJson。我認爲jQuery重用了可能會導致順序異步調用問題的回調函數。 – firsttube