2012-10-01 117 views
2

昨天我给一个话题,其中一个小伙子做了点评:How to use $_GET path with file_exists and keep it safe?指出,我会得到“未定义”返回由于JSON是异步的,。他是对的,我一直试图围绕为什么,但我完全没有深度。我想知道是否有人可以解释发生了什么,所以我可以弄清楚如何使用Deferreds来解决这个问题,或者如果有另一种解决方案。的getJSON请求返回undefined

任何帮助表示赞赏,干杯!

+0

查看关于同步/异步的非专业英语语言和用法问题http://english.stackexchange.com/questions/47022/how-to-best-express-synchronous-asynchronous-in-laymans-terms –

回答

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) }); 
+0

在错误的地方发表评论:P –

+0

哈哈,好的。我正要问;) – PiTheNumber

+0

谢谢。尽管如此,我仍然有点不在。这里的回调函数()和返回值一样,但是先等待呢? – dux0r

0

AJAX异步工作,就像你在说:浏览器不会被“锁定“并等到它完成,直到移到下一行(像任何其他普通代码那样)。

基本上通过具有AJAX功能并且简单地等待测试其结果后,它们将总是返回未定义的,因为它们立即开始。他们不会等到AJAX实际完成。

因此,为什么你需要在这种情况下使用回调函数/递延对象! (因为您正在尝试处理来自AJAX的结果)

1

当您执行$.getJSON()函数时,由于该函数是异步函数,因此在该函数结束之前继续执行。

考虑以下代码:

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

这将首先提醒 “哎”,然后 “有”。这是因为一旦使用Javascript到达$.getJSON(),它开始执行这一要求,但不等待它完成与代码的其余部分,然后再继续执行。

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

希望有帮助!