2014-09-16 3 views
-1

У меня есть форма с опцией выбора, которая отображает некоторые параметры, я хочу получить выбранную опцию, чтобы отобразить ее в текстовом поле. Я использую AJAX для извлечения некоторых XML-данных для отображения в качестве параметров.AJAX асинхронный, вызывающий нулевое значение.

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

Вот мой код:

function loadXML(url, callback){ 
    $.ajax ({ 
     type: "GET", 
     url: url, 
     cache: false, 
     async: true, 
     success: callback, 
    }); 
} 

function displaySubjects(){ 
    loadXML("subjects.xml", function(xml){ 
     $(xml).find("subject").each(function(){ 
      var courseCode = $(this).find("code")[0].textContent; 
      var courseTitle = $(this).find("title")[0].textContent; 
      $('#subject').append("<option value='" + courseCode + "'>" + courseCode + ": " +courseTitle + "</option>"); 
     }) 
    }); 
} 

displaySubjects(); 
console.log($("#subject").val()); //Returns 'null'. 

Как я могу это исправить?

+3

Вы знаете, что означает «асинхронный», верно? Вы исправляете это, выполняя обработку в обратном вызове. – nnnnnn

+0

@nnnnnn Вот что я сделал, я использую анонимную функцию в качестве обратного вызова. Это верно? – user3898380

+2

Вы читаете значение вне обратного вызова! Это как есть пиццу перед тем, как человек доставки привезет ее в ваш дом. Поместите консоль.log в свой обратный вызов. – epascarello

ответ

1

Вы вызываете console.log() перед завершением обратного вызова ajax. Одна вещь, которую вы можете сделать, это добавить еще одну функцию и вызвать ее в обратном вызове.

function loadXML(url, callback){ 
    $.ajax ({ 
     type: "GET", 
     url: url, 
     cache: false, 
     async: true, 
     success: callback, 
    }); 
} 

function displaySubjects(){ 
    loadXML("subjects.xml", function(xml){ 
     $(xml).find("subject").each(function(){ 
      var courseCode = $(this).find("code")[0].textContent; 
      var courseTitle = $(this).find("title")[0].textContent; 
      $('#subject').append("<option value='" + courseCode + "'>" + courseCode + ": " +courseTitle + "</option>"); 
     }); 
     callMeAfterRequestComplete(); 
    }); 


} 

function callMeAfterRequestComplete(){ 
    console.log($("#subject").val()); 
} 

displaySubjects(); 
+0

ok, thnx, мне нужно было получить значение для опции выбора вне функции обратного вызова. – user3898380

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