2010-04-13 138 views
1

我有一个jQuery ajax调用的问题。 我需要等待呼叫完成才能返回值。 但是,脚本似乎跳到了前面,而不是等待呼叫结束。 我的函数然后返回“undefined”。jQuery在继续之前等待Ajax调用结束

我试图使用.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; 
} 
+0

类似的SO:http://stackoverflow.com/questions/2956261/got-stuck-in-the-asynchronous-nature-of-ajax你可以通过在回调参数传递给get_rsrce_name()做到这一点-REQUESTS – 2010-06-03 16:02:34

回答

2

当你告诉它来同步运行它不工作的原因是变量“输出”的回调函数的范围之内只被定义。

几乎可以肯定有更好的方法来做你想做的事情,但没有更多的上下文,这将是很难解释可能是什么。

我推荐的“javascript变量范围”

1

什么乔希说,你已经划定范围与“输出”变量问题展开阅读了。你可以修复,通过在你的函数,像这样的顶级声明输出:

var output; 
+0

我不认为范围的问题,并宣布'output'顶部也无济于事。问题是'$ .post'的异步性质。 – meagar 2010-04-14 15:01:33

+0

的OP提到,他们把它通过设置异步同步调用:假的。 – 2010-04-14 15:44:19

-1

jQuery的。员额()方法默认为异步运行,即:后()函数不停止,并等待响应,它只是立即返回并且脚本的其余部分继续向前。在这种情况下,它继续向您的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的东西。一旦来自服务器的响应回来,该函数会再次调用它自己,但是它会提供响应数据,并调用处理数据的函数的其他部分。

+0

很高兴我不必维护你的代码。这是我可能想到的最荒谬的做法。你为什么要再次调用do_ajax,而不是只有一个处理响应的函数? – 2010-04-14 11:58:55

+0

@Keith我猜这对他来说似乎更紧凑?但是,这是一种非常全面的做事方式。将两个函数组合成一个,通过一个巨大的if/else重载是一个相当混乱的想法,更不用说它递归地调用它自己了。 – meagar 2010-04-14 14:42:24

+0

@凯斯。 ajax请求者调用自己或调用另一个函数有什么区别?无论哪种方式,它都需要调用一个函数来完成数据处理。至少这样,请求和处理逻辑保持在一起。使用一些合适的包装函数,所以你不会乱抛垃圾的代码重复的URL定义和什么,我发现这比维护“getX”和“handleX”函数的代码更容易维护。 – 2010-04-14 15:43:30

0

我不希望你的问题成为范围问题,因为JavaScript具有函数范围,而不是范围范围。在函数的任何位置声明的变量在函数的其他任何地方都可用。这就是为什么JSLint困扰你在顶部宣布它们是:不是因为它的重要功能,而是因为它会提醒你,你的变量可用好像他们在顶部声明无论在哪里你实际申报。试试这个简单的例子:

function ajax(callback) { callback(); } 
$(function() { 
    ajax(function() { x = 7; }); 
    alert(x); // x == 7 
}); 

问题是你$.post调用是异步的。行前output = data;你到达线return output;。这是因为,立即$.post回报,并允许程序继续运行,而一个潜在的慢AJAX调用发生。当AJAX呼叫完成时,它将触发其complete回叫。

您需要调整您的代码,这样你做你的有价值的东西,你传递给$.post回调函数内。

function get_rsrce_name(onComplete) { 
    $.post(url, data, function(data) { onComplete(data); }); 
} 
相关问题