2012-10-01 155 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");

希望有幫助!