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