jQuery ждет, когда вызов ajax будет закончен, прежде чем продолжить

У меня проблема с вызовом 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. Как только ответ от сервера возвращается, функция снова вызывает себя, но это с предоставленными данными ответа, и вызывается другая часть функции, которая обрабатывает данные.