Порядок исполнения Javascript - как это получается? - PullRequest
1 голос
/ 03 января 2009

Я совершенно не понимаю, почему Javascript делает определенные вещи таким образом, или, может быть, я что-то не так кодировал. Но как получается, что код после выполнения $ .getJSON до завершения обратного вызова?

window.ratingCallback = function(data){

     if(data[0].code == 3){  
         ratingHTML = buildHTML(0);
         console.log('a'+ratingHTML);
         return;
     }

     ratingHTML = buildHTML(data[0].rating);
     console.log('b'+ratingHTML);
     return;
 };

  function buildHTML(pageRating){

     for(counter = 1; counter <= 5; counter++){

         if(counter == pageRating){
                 ratingHTML += '<input name="star1" type="radio" class="star" value="'+counter+'" checked="checked"/>';
         } else {
                 ratingHTML += '<input name="star1" type="radio" class="star" value="'+counter+'"/>';    
         }
     }

     return ratingHTML;
 }


$.getJSON("https://domain.com/"+data+"?jsoncallback=?");

console.log(ratingHTML+"WHY DOES THIS EXECUTE FIRST AND NOT AFTER THE CALLBACK SINCE IT IS PLACED AFTER getJSON????");

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

Я понимаю, что обратный вызов вызывается, когда удаленный сервер дал ответ, но могу ли я позволить остальной части сценария подождать с дальнейшим выполнением? Без помещения всего кода в функцию обратного вызова или любую функцию?

Большое спасибо!

Лед

Ответы [ 3 ]

7 голосов
/ 03 января 2009

Вызов getJSON () является асинхронным.

Это даже упоминается в документах (http://docs.jquery.com/Ajax/jQuery.getJSON):

Примечание: имейте в виду, что строки после эта функция будет выполнена раньше обратный вызов.

4 голосов
/ 03 января 2009

getJSON - это асинхронный метод, который в основном означает, что при его вызове он немедленно возвращается к основному потоку программы. Так что это «не блокирует». Вы должны поместить ваш console.log в метод обратного вызова, если хотите, чтобы он регистрировался после выполнения getJSON. Или, если вы не хотите следовать шаблону обратного вызова и хотите, чтобы ваш вызов был синхронным, используйте вызов ajax и установите для параметра async значение false. Имейте в виду, что это приведет к блокировке браузера или к его зависанию при получении данных.

3 голосов
/ 03 января 2009

AJAX-запросы обычно выполняются асинхронно (первый A в AJAX). Это означает, что запрос начнется, затем он продолжит выполнение кода, не ожидая возврата запроса.

Если вы хотите подождать, вы можете установить запросы в синхронном режиме, но я не уверен, как это сделать в jquery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...