昨天我给一个话题,其中一个小伙子做了点评:How to use $_GET path with file_exists and keep it safe?指出,我会得到“未定义”返回由于JSON是异步的,。他是对的,我一直试图围绕为什么,但我完全没有深度。我想知道是否有人可以解释发生了什么,所以我可以弄清楚如何使用Deferreds来解决这个问题,或者如果有另一种解决方案。的getJSON请求返回undefined
任何帮助表示赞赏,干杯!
昨天我给一个话题,其中一个小伙子做了点评:How to use $_GET path with file_exists and keep it safe?指出,我会得到“未定义”返回由于JSON是异步的,。他是对的,我一直试图围绕为什么,但我完全没有深度。我想知道是否有人可以解释发生了什么,所以我可以弄清楚如何使用Deferreds来解决这个问题,或者如果有另一种解决方案。的getJSON请求返回undefined
任何帮助表示赞赏,干杯!
你的代码是
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) });
AJAX异步工作,就像你在说:浏览器不会被“锁定“并等到它完成,直到移到下一行(像任何其他普通代码那样)。
基本上通过具有AJAX功能并且简单地等待测试其结果后,它们将总是返回未定义的,因为它们立即开始。他们不会等到AJAX实际完成。
因此,为什么你需要在这种情况下使用回调函数/递延对象! (因为您正在尝试处理来自AJAX的结果)
当您执行$.getJSON()
函数时,由于该函数是异步函数,因此在该函数结束之前继续执行。
考虑以下代码:
$.getJSON("/ajax/fileExists.php",{ path: path }, function (data){
alert("THERE");
});
alert("HEY");
这将首先提醒 “哎”,然后 “有”。这是因为一旦使用Javascript到达$.getJSON()
,它开始执行这一要求,但不等待它完成与代码的其余部分,然后再继续执行。
所以它继续并执行alert("HEY");
。然后,后来,你$.getJSON
请求完成时,你的回调函数执行和执行alert("THERE");
。
希望有帮助!
查看关于同步/异步的非专业英语语言和用法问题http://english.stackexchange.com/questions/47022/how-to-best-express-synchronous-asynchronous-in-laymans-terms –