我遇到了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;
}
答案 0 :(得分:2)
当你告诉它同步运行时它不工作的原因是变量'output'只在回调函数的范围内定义。
几乎可以肯定有更好的方法来做你想要做的事情,但如果没有更多的背景,那么解释那可能会是什么很难。
我建议阅读“javascript变量范围”
答案 1 :(得分:1)
扩展Josh所说的内容,您对“输出”变量存在范围问题。你可以通过在函数顶部声明输出来解决这个问题:
var output;
答案 2 :(得分:0)
我不希望您的问题成为范围问题,因为JavaScript具有功能范围,而不是阻止范围。函数中任何位置声明的变量都可以在函数的任何其他位置使用。这就是为什么JSLint困扰你在顶部声明它们的原因:不是因为它在功能上很重要,而是因为它会提醒你你的变量可用就像它们被声明在顶部一样你实际申报它们的地方试试这个简单的例子:
function ajax(callback) { callback(); }
$(function() {
ajax(function() { x = 7; });
alert(x); // x == 7
});
问题是您的$.post
调用是异步的。您在return output;
行前到达output = data;
行。发生这种情况是因为$.post
会立即返回并允许您的程序继续运行,同时发生可能缓慢的AJAX调用。当AJAX调用完成时,它将触发其complete
回调。
您需要重新构建代码,以便在传递给$.post
的回调函数中使用您的值。您可以通过将回调参数传递给get_rsrce_name()
:
function get_rsrce_name(onComplete) {
$.post( url, data, function(data) { onComplete(data); });
}
答案 3 :(得分:-1)
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
参数最初为null。该函数看到数据为null,并执行AJAX。一旦来自服务器的响应返回,该函数再次调用自身,但这提供了响应数据,并且调用处理数据的函数的其他部分。