Странное поведение при взаимодействии с массивом объектов JSON с помощью jQuery

#javascript #ajax #json #jquery

#javascript #ajax #json #jquery

Вопрос:

Это мой пример ответа JSON:

 [{"id":11137,"name":"Agra"},{"id":11138,"name":"Albizzate"}]
  

и мне нужно выполнить итерацию каждого объекта массива и распечатать id и name :

         $.ajax({
            url: '{{ path('ajax_provinces') }}',
            type: 'POST',
            dataType: 'json',
            data: {region_id: this.value},
            success: function(provinces) {},
            error: function() { alert("error"); },
            complete: function(provinces) {
                $('select#regions ~ span > img').fadeOut('slow');
                $.each(provinces, function(key, val) {
                    alert(key   ": "   val);
                });
            }
        });
  

Проблема в том, что я получаю странные результаты: имена функций, тела функций и другие внутренние данные из jQuery. Похоже, что он перебирает функции библиотеки jQuery! Есть какие-нибудь подсказки, что происходит?

Ответ №1:

Проблема в том, что complete обратный вызов не передает возвращенные данные в качестве аргумента:

завершено (jqXHR, textStatus)

Функция, вызываемая при завершении запроса (после выполнения успешных и ошибочных обратных вызовов). Функции передаются два аргумента: Объект jqXHR (в jQuery 1.4.x, XMLHttpRequest) и строка, классифицирующая статус запроса («успех», «не изменен», «ошибка», «тайм-аут», «прерывание» или «ошибка синтаксического анализа»).

(из документации)

Предположительно, странные ключи / значения, которые вы видите, являются атрибутами jqXHR объекта.

Вам нужно обрабатывать возвращаемые данные в success , а не complete . Насколько я понимаю, complete это обычно используется для действий, которые должны выполняться независимо от того, успешно ли запрос AJAX вернул данные (например, скрытие анимации загрузки).

Ответ №2:

Вам нужно обработать возвращенные данные успешно, а не завершить. Complete используется, когда вам нужно запустить функцию после завершения вызова AJAX. В случае успеха вы получите данные, отправленные с сервера в виде

 success:function(data){

/// data is JSON object. Now iterate it here 

var i;
    for(i in data){
        alert('the Id =' data['id'] ' the name ' data['name']);

      }

}