2017-02-09 3 views
-1

Я извлекаю серию данных с сервера (геосервера) с использованием $ .ajax.Ajax loop and response order

The (упрощенный) запрос выглядит следующим образом:

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).

Проблема что готовый список всегда в другом порядке. Мне нужен результат в том же порядке, что и запросы.

Это может быть проблема закрытия, где индекс i, который передается функции ajax и выделение dataList, которое происходит в более поздней точке (когда каждый цикл перемещен). Я пробовал позаботиться об этом, как this, но проблема остается такой же. Также $.each, как и в приведенном выше коде, в любом случае должно создать отдельное закрытие для каждой итерации.

Мне удалось реализовать recursive function, но его синхронно.

редактировать: suggested duplicate не имеет дела с зацикленной AJAX просит

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) – Liam

+0

* «Возможно, это проблема закрытия, где индекс ...» * Nope * «У меня есть отложенные функции, такие как« * uhm ... нет, не так ли? вам не хватает $ .when и возврата. и отложенный массив. –

+1

Я добавил ответ с предложением, но теперь я внимательно прочитал, что вы хотите запустить событие, когда все запросы завершены, и это было неправильно, поэтому я удалил. – mrlew

ответ

1

проблема не была связана с deferreds, но к JSONP или связанный с ним jsonpcallback, необходимый для запроса. Запрос данных в формате JSON решена проблема

кредиты @charlietfl для ответа более на: Looped ajax request. Error handling and return order

Для тех, кто ищет это: у вас, скорее всего, придется, чтобы позволить Cross-Origin Resource Sharing on geoserver, чтобы иметь возможность получить доступ к JSON непосредственно

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 (отложенные [0]). Then (function (data) {value = data}) Существует ли более простой способ доступа к данным в отложенных условиях? – unnic

+0

Я только что проверил значения, исходящие от отложенных меток выше, и порядок случайный снова – unnic

+0

Невозможно. Что-то еще не так – charlietfl