Php jQuery等待ajax调用结束,然后继续

Php jQuery等待ajax调用结束,然后继续,php,javascript,jquery,ajax,response,Php,Javascript,Jquery,Ajax,Response,我对jQueryAjax调用有问题。 我需要等待调用完成才能返回值。 然而,脚本似乎向前跳,而不是等待调用结束。 然后,我的函数返回“未定义” 我尝试使用.ajax()方法并将async的值设置为false,但这也不起作用 我可以让我的函数返回通过ajax调用可以返回的值吗 谢谢大家! 代码如下: function get_rsrce_name(){ jQuery.post( '<?php echo admin_url( 'admin-ajax.php' );

我对jQueryAjax调用有问题。 我需要等待调用完成才能返回值。 然而,脚本似乎向前跳,而不是等待调用结束。 然后,我的函数返回“未定义”

我尝试使用.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;
}
函数get\u rsrce\u name(){ jQuery.post( '', {action:'my_action',option_rsrce:'option_rsrce'}, 功能(数据){ 输出=data.option\u名称; }, “json” ); 返回输出; }
当您告诉它同步运行时,它不工作的原因是变量“output”仅在回调函数的范围内定义

几乎可以肯定的是,有更好的方法来做你想做的事情,但如果没有更多的背景,很难解释这可能是什么


我建议大家阅读“javascript变量作用域”

进一步了解Josh所说的内容,即“输出”变量存在作用域问题。您可以通过在函数顶部声明输出来解决此问题,如下所示:

var output;
jQuery的.post()方法默认为异步运行,即:post()函数不会停止并等待响应,它只会立即返回,脚本的其余部分继续运行。在本例中,它将继续执行
return
语句

现在我们进入了一个经典的比赛状态。。。AJAX请求能否在脚本的其余部分继续执行返回调用之前完成并执行
函数(数据)
?考虑到大多数网络都有以毫秒为单位的延迟,并且返回调用将在几微秒后执行,很可能不会。。。每次回叫都会赢得比赛

您必须重新安排代码,以便调用此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操作。一旦来自服务器的响应返回,函数将再次调用自身,但这需要提供响应数据,并调用处理数据的函数的另一部分。

我不认为您的问题是范围问题,因为JavaScript具有函数范围,而不是块范围。函数中任何位置声明的变量在函数中的任何其他位置都可用。这就是为什么在顶部声明它们会让您感到烦恼:不是因为它在功能上很重要,而是因为它会提醒您,您的变量是可用的,就好像它们是在顶部声明的一样,而不管您实际在哪里声明它们。试试这个简单的例子:

function ajax(callback) { callback(); }
$(function() {
  ajax(function() { x = 7; });
  alert(x); // x == 7
});
问题是您的
$。post
调用是异步的。您正在到达返回输出的行
行前<代码>输出=数据。这是因为
$.post
会立即返回并允许您的程序继续,而AJAX调用可能会很慢。当AJAX调用完成时,它将触发其
complete
回调

您需要重新构造代码,以便在传递给
$.post
的回调函数中使用您的值进行操作。您可以通过将回调参数传递到
get\u rsrce\u name()
来完成此操作:


很高兴我不用维护你的代码。这是我能想到的最荒谬的方法。为什么你要再次调用do_ajax,而不是只使用一个函数来处理响应?@Keith我想对他来说它似乎更紧凑了?但是,是的,这确实是一种迂回的做事方式。将两个函数合并为一个,通过一个巨大的if/else重载是一个相当混乱的想法,更不用说让它递归地调用自己了。@Keith。ajax请求程序调用自身或调用另一个函数有什么区别?无论如何,它都必须调用一个函数来进行数据处理。至少这样,请求逻辑和处理逻辑保持在一起。有了一些合适的包装函数,您就不会在代码中乱丢重复的URL定义之类的东西,我发现这比在代码中乱丢“getX”和“handleX”函数要容易得多。有一个基本上只执行if而不共享逻辑的泛型函数怎么可能更好呢。你听说过责任分离吗?我认为范围不是问题,在顶部声明
output
也没有帮助。问题是
$的异步性质。post
。OP提到他们通过设置async:false使其成为同步调用。类似于:
function get_rsrce_name(onComplete) {
  $.post( url, data, function(data) { onComplete(data); });
}