Вам нужен учебник о том, как работают асинхронные вызовы ajax.
Когда вы звоните $.post()
, он запускает сетевой вызов, чтобы выполнить сообщение, сразу же возвращается из вызова $.post()
и продолжает выполнение остальных.вашего JavaScriptОн даже сразу выйдет из вашей функции get_users()
.
Но вызов ajax еще не сделан - он все еще выполняется.Через некоторое время вызов ajax завершится, и когда это произойдет, будет вызван обработчик успеха для вызова ajax, который вы определили как function(response) {...}
.Только тогда, позднее, будет известно значение ответа от вызова ajax.
Это то, что означает асинхронный ajax.Вы не можете написать вызов типа get_users () и ожидать, что он получит пользователей и вернется с ними.Вместо этого вы должны использовать функции обратного вызова, которые будут вызваны через некоторое время (когда завершится ajax), и тогда вы сможете продолжить путь своего кода.Да, это неудобно, но это то, как все работает в javascript с асинхронными вызовами ajax.Преимущество асинхронных вызовов ajax заключается в том, что браузер и другой код javascript могут полностью работать, пока идет вызов ajax.Стоимость асинхронных вызовов ajax заключается в том, что их кодирование является более сложным.
У вас есть несколько вариантов решения этой проблемы.Во-первых, вы можете сделать свой вызов get_users (), а затем просто продолжить последовательность программирования, которую вы хотите выполнить во внутреннем обратном вызове внутри get_users()
, поскольку это единственное место, где известен ответ (фактические пользователи).Если вы используете get_users()
только в одном месте своего кода, тогда это может работать нормально.Это выглядело бы так:
function get_users() {
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
function(response) {
// process the user list here and continue whatever other code you
// need that deals with the user list
},
'json'
);
}
Если вам нужно использовать get_users()
в нескольких разных местах для разных целей, то вы можете изменить его так, чтобы он принимал сам обратный вызов и позволял после звонка просто вызвать этот обратный вызов.когда вызов Ajax сделан.Затем вы завершили бы обработку ответа в этой функции обратного вызова:
function get_users(callback) {
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
callback,
'json'
);
}
В этом втором варианте вы можете вызвать get_users()
следующим образом:
get_users(function(response) {
// process the user list here and continue whatever other code you
// need that deals with the user list
});
Есть еще более продвинутыеопции доступны с использованием отложенного объекта jQuery .