昨天我給一個話題,其中一個小夥子做了點評: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 –