2017-02-09 28 views
-1

我使用$ .ajax從服務器(geoserver)檢索一系列數據。Ajax循環和響應順序

(簡化)的要求是這樣的:

var dataList=[]; 
//var urllist= // a list of several URLs to request data from 


$.each(urllist,function(i) { 
    $.ajax({ 
     jsonpCallback: 'getJson', 
     type: 'GET', 
     url: urllist[i], 
     dataType: 'jsonp', 
     success: function(data) { 
        dataList[i]=data.value; 
        } 
    }) 
}); 

我需要寫的全局變量dataList,因爲我需要火後從urllist所有請求完成的事件。 (我有推遲實施像so)。

問題是完成的列表總是以不同的順序。我需要的結果與請求的順序相同。

這可能是一個封閉的問題,其中傳遞給ajax函數的索引i以及發生在稍後時間點(每個循環移動時)的分配爲dataList。 我試圖照顧像this,但問題依然如此。另外$.each像上面的代碼應該爲每個迭代創建一個單獨的閉包。

我設法實現了一個recursive function但它的同步。

編輯:suggested duplicate不與環形阿賈克斯處理請求

+0

可能重複[如何返回來自異步調用的響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call ) – Liam

+0

*「這可能是一個關閉的問題,在索引...」*沒有*「我有推遲執行像」*呃......不,你不?你錯過了$ .when和返回。和延遲數組。 –

+1

我添加了一個帶有建議的答案,但現在我仔細閱讀了您想在所有請求都完成時觸發事件並且它不正確,因此我將其刪除。 – mrlew

回答

1

您可以訪問所有的結果$.when回調以正確的順序

// map an array of promises 
var deferreds = urllist.map(function(url){ 
    // return the promise that `$.ajax` returns 
    return $.ajax({   
     url: url, 
     dataType: 'jsonp' 
    }).then(function(data){ 
     return data.value; 
    }) 
}); 

$.when.apply($, deferreds).then(function(results){ 
    // results will be array of each `data.value` in proper order 
    var datalist = results; 
    // now do whatever you were doing with original datalist 
    $.each(datalist.... 

}).fail(function(){ 
    // Probably want to catch failure 
}).always(function(){ 
    // Or use always if you want to do the same thing 
    // whether the call succeeds or fails 
}); 
+0

這樣,我只是得到一個單一的值的結果。這就是爲什麼在成功處理者中使用全局變量。我可以用$ .when得到一個值(deferreds [0])。then(function(data){value = data})有沒有更簡單的方式來訪問延遲數據? – unnic

+0

我剛剛用上面的方法檢查了來自延期的值,而且順序是隨機的 – unnic

+0

不可能。還有其他問題 – charlietfl