我昨天发布了一个主题,其中一个家伙发表了评论:如何将 $_GET 路径与 file_exists 一起使用并保持安全?说明由于 JSON 是异步的,我会返回“未定义”。他是对的,我一直试图弄清楚为什么,但我觉得完全超出了我的理解范围。我想知道是否有人可以解释正在发生的事情,以便我可以弄清楚如何使用 Deferreds 来解决这个问题,或者是否有其他解决方案。
任何帮助表示赞赏,干杯!
我昨天发布了一个主题,其中一个家伙发表了评论:如何将 $_GET 路径与 file_exists 一起使用并保持安全?说明由于 JSON 是异步的,我会返回“未定义”。他是对的,我一直试图弄清楚为什么,但我觉得完全超出了我的理解范围。我想知道是否有人可以解释正在发生的事情,以便我可以弄清楚如何使用 Deferreds 来解决这个问题,或者是否有其他解决方案。
任何帮助表示赞赏,干杯!
执行$.getJSON()
函数时,会在该函数结束之前继续执行,因为该函数是异步的。
考虑这段代码:
$.getJSON("/ajax/fileExists.php",{ path: path }, function (data){
alert("THERE");
});
alert("HEY");
这将首先提醒“嘿”,然后是“那里”。发生这种情况是因为一旦 Javascript 到达$.getJSON()
,它就会开始执行该请求,但在继续执行其余代码之前不会等待它完成执行。
所以它继续并执行alert("HEY");
。然后,稍后,当您的$.getJSON
请求完成时,您的回调函数将执行并执行alert("THERE");
。
希望有帮助!
你的代码是
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 函数,然后简单地if() else()
等待测试它的结果,它们总是会返回 undefined ,因为它们会立即启动。他们不会等到 AJAX 实际完成。
因此,为什么在这种情况下需要使用回调函数/延迟对象!(因为您正在尝试使用从 AJAX 返回的结果)