Php jQuery等待ajax调用结束,然后继续
我对jQueryAjax调用有问题。 我需要等待调用完成才能返回值。 然而,脚本似乎向前跳,而不是等待调用结束。 然后,我的函数返回“未定义” 我尝试使用.ajax()方法并将async的值设置为false,但这也不起作用 我可以让我的函数返回通过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' );
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); });
}