Я совершенно не понимаю, почему 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 был глобальной переменной.
Я понимаю, что обратный вызов вызывается, когда удаленный сервер дал ответ, но могу ли я позволить остальной части скрипта подождать с дальнейшим выполнением? Без размещения всего кода в функции обратного вызова или какой-либо другой функции?
Большое спасибо!
Лед



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вызов 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.