Порядок выполнения Javascript - как это происходит?

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

window.ratingCallback = function(data){

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

     ratingHTML = buildHTML(data[0].rating);
     console.info('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.info(ratingHTML+"WHY DOES THIS EXECUTE FIRST AND NOT AFTER THE CALLBACK SINCE IT IS PLACED AFTER getJSON????");

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

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

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

Лед

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 482
3

Ответы 3

Вызов getJSON () асинхронный.

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

Note: Keep in mind, that lines after this function will be executed before callback.

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

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

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

Другие вопросы по теме