如何使用jQuery在函数中存储ajax调用的结果?

时间:2011-10-16 13:49:05

标签: javascript jquery asynchronous scope anonymous-function

我有以下代码:

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函数中返回falsecheckPermission

2 个答案:

答案 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!”

回调函数的全部目的是确保您在完成请求后能够执行某些代码。