Используя $ .post в функции JavaScript, не можете присвоить значение переменной?
Вопрос
Я пытаюсь использовать $ .post внутри функции, получить результаты, а затем вернуть функцию true или false на основе результатов обратного вызова $ .post. Однако обратный вызов, кажется, происходит, ПОСЛЕ возврата события родительской функции.
Вот текущий код, переменная ret всегда неопределена, но если я оповестю ее () в обратном вызове $ .post, он вернет правильный результат;
function elementExists(key, type, path, appid, pid){
var ret;
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
ret = data;
});
alert(ret);
return ret;
}
Решение
Как вы обнаружили, пост выполняется асинхронно. Если вы хотите, чтобы он был синхронным, вам нужно использовать ajax
и установите для параметра async
значение false. Однако было бы лучше признать, что сообщение является асинхронным, и построить ваш код таким образом, чтобы действие, выполняемое обратным вызовом, не зависело от метода, который вызывает сообщение. Очевидно, что вы действительно хотите сделать что-то кроме оповещения, но не зная, что трудно посоветовать вам, как это сделать.
РЕДАКТИРОВАТЬ . Я понимаю, что ваш код проверяет, существует ли что-то, но проверяет это с определенной целью. Если бы мы знали, какова цель, то можно было бы порекомендовать, как выполнить это в обратном вызове, чтобы метод мог быть реорганизован.
Другие советы
function elementExists(key, type, path, appid, pid){
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
alert(data);
});
}
функция (data) - это обратный вызов (асинхронный), вы не можете возвращать подобные значения.
если обратный вызов не вызывается до тех пор, пока не завершится вызов страницы, но ваш " return ret " выполняется сразу после вызова $ .post
Если вы хотите установить синхронность, установите async: false
Смотрите документы http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype р>
Проблема в том, что ваш код выполняется асинхронно. То есть alert (ret) на самом деле вызывается перед ret = data, что происходит после завершения Ajax-запроса.
Вы можете сделать ваши ajax-вызовы синхронными (не рекомендуется), используя async или измените код.