getJSON请求返回undefined

时间:2012-10-01 14:27:05

标签: jquery json asynchronous

昨天我发表了一个话题,一位家伙发表了评论:How to use $_GET path with file_exists and keep it safe?说我得到了#34;未定义"由于JSON异步而返回。他是对的,我一直试图绕过原因,但我觉得完全超出了我的深度。我想知道是否有人可以解释发生了什么,所以我可以弄清楚如何使用Deferreds来解决这个问题,或者是否有另一个解决方案。

欢迎任何帮助,欢呼!

3 个答案:

答案 0 :(得分:1)

执行$.getJSON()函数时,在该函数结束之前继续执行,因为该函数是异步的。

考虑以下代码:

$.getJSON("/ajax/fileExists.php",{ path: path }, function (data){
    alert("THERE");
});
alert("HEY");

这将首先警告“HEY”,然后“THERE”。发生这种情况是因为一旦Javascript到达$.getJSON(),它就开始执行该请求,但是在继续执行其余代码之前不会等待它完成执行。

所以它继续并执行alert("HEY");。然后,稍后,当您的$.getJSON请求完成时,您的回调函数会执行并执行alert("THERE");

希望有所帮助!

答案 1 :(得分:0)

您的代码是

function fileExists(path){
    $.getJSON("/ajax/fileExists.php",{ path: path },
    function (data){
        return data.path;
    });
}

这里的问题是内部函数是一个回调函数,而return内部函数将在Ajax请求之后执行。此时外部函数fileExists已经完成。它只启动了请求,并没有等待它结束。

要解决此问题,您可以进行回调

function fileExists(path, callback){
    $.getJSON("/ajax/fileExists.php",{ path: path },
    function (data){
        callback(data.path);
    });
}

像这样使用

fileExists('/a/path', function(path){ console.log(path) } );

答案 2 :(得分:0)

AJAX异步工作就像你说的那样:浏览器没有被“锁定”并等到它完成,直到移动到下一行(就像你的任何其他常规代码一样)。

基本上,通过拥有一个AJAX函数,然后只需if() else()等待测试其结果,它们将始终返回undefined,因为它们立即开始。他们不会等到AJAX实际完成。

因此,在这种情况下,为什么需要使用回调函数/延迟对象! (因为您正在尝试使用从AJAX返回的结果)