tl; dr
Как лучше всего дождаться завершения $ .get JSON перед выполнением остальной части кода, если это не одна функция, а множество которые полагаются на ответ?
Более подробное объяснение:
У меня есть приложение javascript, которое достигло определенного уровня сложности. Конец тысячи строк кода и двух дюжин функций - и конца не видно. Приложение полагается на значения, хранящиеся в базе данных. Точнее, у меня нет ни одной функции, которая полагается на запрошенные данные, но большинство моих функций используют эти значения и некоторую точку.
До сих пор я извлекал данные из базы данных в php и просто повторил их в полях ввода, а затем прочитал их в js. Но с увеличением числа переменных, передаваемых таким образом, это становится громоздким и не очень элегантным. У меня есть большинство данных, доступных в объектах, и вставка их переменных-членов в поля ввода кажется ... неуклюжей.
Я размышлял о различных способах передачи данных и остановился на jquery ajax по нескольким причинам, а не по По крайней мере, это чистое разделение слоев, а я использую jquery ajax уже для других вещей.
Проблема: Я столкнулся с проблемами состояния гонки. Часть моего кода, который полагается на данные, запрошенные get JSON, выполняется до завершения запроса. И это нарушает работу всего приложения. Я уже немного исследовал и теперь знаю, что есть несколько способов решить эту проблему, однако у меня нет опыта, чтобы судить, какой подход мне следует выбрать.
- Используйте
async: false
, это все еще работает и работает. вероятно, самая простая вещь для реализации, но она отмечена как устаревшая, и поэтому я не решаюсь ее использовать. - Помещение всего в обработчик успеха, например
$.getJSON("../sender.php", params, function (result) {
//my whole application
});
Используйте обещания. Если я правильно понимаю, это означает, что мне нужно обернуть
$.when( req1, req2, req3 ).done( ... )
каждую функцию, в которой я использую запрошенное значение. Это не кажется хорошим для читабельности, и я узнал, что чистый, читаемый код обычно лучше, чем сложный конструкции. Используйте синхронный запрос, например
var request = new XMLHttpRequest();
request.open('GET', '../sender.php', false);
request.send(params);
if (request.status === 200) {
//fill the variables with the returned values
}
Что-то еще? Это только самые распространенные решения, которые я нашел, вероятно, есть другие возможности, как это сделать. Благодарю за каждое предложение!