2010-10-08 6 views
0

в первом сервере вызовов ajax возвращает строку json, которая преобразуется в массив js. Я хочу запустить ajax-вызов для каждого элемента массива.Вложенные вызовы AJAX

Например, первый вызов ajax возвращает семестр 1,2,3,4. Теперь я хочу получить предметы для семестра 1 и показать их в таблице, затем получить предметы семестра 2 и показать все предметы в таблице и т. Д.

Я написал код, но он отображает все темы в последних Таблица. Кто-нибудь может мне помочь?

$.ajax(
     { 
      type: "POST", 
      url: "returnSemesterNumbers", 
      data: "programId="+selectedprog, 
      success: function(data) 
      { 
       var semesters=$.parseJSON(data); 
       for(x in semesters) 
       { 
        semnum=semesters[x].semesterNumber; 
        alert(semnum); 
        $("#tables").append('<table id=table'+x+' style=float:left><tr><td>'+semnum+'</td></tr>'); 
        $.ajax(
          { 
           type: "POST", 
           url: "returnCourses", 
           data: "programId="+selectedprog+"&semNum="+semnum, 
           success: function(data1) 
           { 
            var courses=$.parseJSON(data1); 
            for(y in courses) 
            { 
             $("#table"+x).append('<tr><td>'+courses[y].title+'</td></tr>'); 
            } 
           } 
          }); 
        $("#table"+x).append('</table>'); 
        } 
       } 
      }); 
      } 
      else 
      { 
       $("#tables").css('display','none'); 
      } 
}); 
+3

Если вы добавите 'dataType: 'json'', вам не понадобится' $ .parseJSON (data) '. 'data' будет проанализирован для вас. –

ответ

6

Обратный вызов во внутреннем вызове Ajax захватывает переменную x по ссылке.

Поскольку все обратные вызовы запускаются после цикла, все они получают текущее значение x, которое является последним элементом в наборе.

Вам необходимо переместить код в цикле в отдельную функцию, которая принимает параметр x.

1

Объем переменных x также может вызывать проблемы.

Вместо:

for(x in semesters) 

попробовать:

for(var x in semesters) 

Что объявят й в качестве переменного в рамках вашей первой функции успеха AJAX, а не глобальный, который может быть изменен любой другой код (включая jQuery).

+0

Это не поможет. (Остается только одна переменная 'x') – SLaks

+0

OP вызывает библиотечную функцию, которая может изменить глобальный' x' до возврата второго запроса ajax. То, что это не означает, не гарантирует, что это не будет. Добавляя 'var', эту возможность можно избежать. – Gus

+0

Это маловероятно (хотя вы правы, он должен использовать 'var'). Реальная проблема заключается в повторном использовании; см. мой ответ. – SLaks

Смежные вопросы