У меня проблема с вызовом jQuery ajax. Мне нужно дождаться завершения вызова, чтобы вернуть значение. Тем не менее, сценарий, кажется, продвигается вперед и не дожидается завершения вызова. моя функция затем возвращает «undefined».
Я попытался использовать метод .ajax () и установить значение async в false, но это тоже не сработает.
Я мог бы заставить свою функцию вернуть значение, которое мог бы выполнить через вызов ajax?
Спасибо!
Вот код:
function get_rsrce_name(){ jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', { action :'my_action', option_rsrce : 'option_rsrce' }, function( data ) { output = data.option_name; }, "json" ); return output; }
Причина, по которой он не работает, когда вы говорите, что он работает синхронно, заключается в том, что переменная 'output' определяется только в пределах функции обратного вызова.
Существует почти наверняка лучший способ сделать то, что вы пытаетесь сделать, но без дополнительного контекста будет сложно объяснить, что это может быть.
Я бы рекомендовал читать «область видимости javascript»,
Расширяясь от того, что сказал Джош, у вас есть проблемы с переменной «output». Вы можете исправить это, объявив вывод в верхней части своей функции следующим образом:
var output;
Я бы не ожидал, что ваша проблема будет проблемой, поскольку JavaScript имеет область функций, а не область блока. Переменные, объявленные в любом месте функции, доступны в любом месте в функции. Вот почему JSLint мешает вам объявить их наверху: не потому, что это функционально важно, а потому, что это напомнит вам, что ваши переменные доступны, как если бы они были объявлены наверху независимо от того, где вы их объявляете. Попробуйте этот простой пример:
function ajax(callback) { callback(); } $(function() { ajax(function() { x = 7; }); alert(x); // x == 7 });
Проблема заключается в том, что ваш вызов $.post
является асинхронным. Вы достигаете return output;
результата линии return output;
перед output = data;
линии output = data;
, Это происходит из- $.post
что $.post
возвращается немедленно и позволяет вашей программе продолжить, в то время как происходит потенциально медленный вызов AJAX. Когда вызов AJAX завершается, он запускает свой complete
обратный вызов.
Вам нужно перестроить свой код, чтобы вы делали что-то с вашим значением внутри функции обратного вызова, которую вы передаете в $.post
. Вы можете выполнить это, передав параметр обратного вызова get_rsrce_name()
:
function get_rsrce_name(onComplete) { $.post( url, data, function(data) { onComplete(data); }); }
Метод jQuery .post () по умолчанию запускается асинхронно, т. е. функция post () не останавливается и ждет ответа, она сразу возвращается, а остальная часть вашего скрипта продолжается. В этом случае он продолжается до вашего оператора return
.
И теперь мы доходим до классического состояния гонки … может ли запрос AJAX завершить И выполнить function ( data )
до того, как остальная часть скрипта продолжит переход к обратному вызову? Учитывая, что большинство сетей имеют задержки, измеренные в миллисекундах, а обратный вызов будет выполняться через несколько микросекунд позже, скорее всего, не … обратный вызов победит в гонке каждый раз.
Вам придется перестроить свой код, чтобы внешняя функция, вызывающая этот запрос AJAX, может быть повторно вызвана с результатами запроса AJAX.
Простым методом для этого является создание двухчастной функции:
function do_ajax(parameters, data) { if (data == null) { jquery.post( .... success: function(data) { do_ajax(parameters, data); } ); } else { ... handle response here ... } }
Таким образом, функция может быть вызвана любыми данными, которые необходимо передать в вызов AJAX ( parameters
), а параметр data
изначально равен нулю. Функция видит, что данные являются нулевыми, и делает материал AJAX. Как только ответ от сервера возвращается, функция снова вызывает себя, но это с предоставленными данными ответа, и вызывается другая часть функции, которая обрабатывает данные.