我有以下代码:
function checkPermission(user) {
var result = 'default';
$.get('/mymodule/checkPermission.php?user=' + user, function(data) {
result = data; // does not store data into result, why ?
if (result == 'no') {
$('.sorry_msg').show();
}
});
alert(result); // shows "default".
return result == 'yes';
}
你能解释为什么这不起作用。问题是我无法将data
变量存储到result
中,请参阅代码中的注释。我猜是因为匿名函数,但我不知道javascript到底能够准确理解会发生什么。
另外,如何根据ajax调用的结果在true
函数中返回false
或checkPermission
?
答案 0 :(得分:5)
您没有得到预期的结果,因为ajax回调函数是异步执行的。这意味着该进程不会等待ajax调用完成。因此,在ajax调用执行回调函数之前,外部函数checkPermission
已经终止,并且它的返回值因此不会被ajax回调改变。
@pinouchon:
我已经看到了你建议的解决方案,但我建议不要使用同步ajax请求,因为这将阻止浏览器的整个用户界面,因为它必须等待ajax请求的结果。我建议你重新考虑你的执行策略,并围绕异步执行的ajax请求构建它。
答案 1 :(得分:2)
jQuery的get()
方法是一个AJAX调用,因此与您的方法异步。完成get()
调用时调用的函数(更改结果值的函数)在现有警报之后执行。试试这个:
$.get('/mymodule/checkPermission.php?user=' + user, function(data) {
result = data; // does not store data into result.
alert("Ajax Complete!"); // NEW ALERT CALL - called upon Ajax Completion
if (result == 'no') {
$('.sorry_msg').show();
}
});
您会看到警报的顺序是“默认”,然后是“Ajax Complete!”
回调函数的全部目的是确保您在完成请求后能够执行某些代码。