2

我昨天发布了一个主题,其中一个家伙发表了评论:如何将 $_GET 路径与 file_exists 一起使用并保持安全?说明由于 JSON 是异步的,我会返回“未定义”。他是对的,我一直试图弄清楚为什么,但我觉得完全超出了我的理解范围。我想知道是否有人可以解释正在发生的事情,以便我可以弄清楚如何使用 Deferreds 来解决这个问题,或者是否有其他解决方案。

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

4

3 回答 3

1

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

考虑这段代码:

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

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

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

希望有帮助!

于 2012-10-01T14:33:42.497 回答
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) } );
于 2012-10-01T14:31:41.103 回答
0

AJAX 像您所说的那样异步工作:浏览器不会“锁定”并等到它完成直到移动到下一行(就像您的任何其他正常代码一样)。

基本上通过拥有一个 AJAX 函数,然后简单地if() else()等待测试它的结果,它们总是会返回 undefined ,因为它们会立即启动。他们不会等到 AJAX 实际完成。

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

于 2012-10-01T14:32:05.860 回答