2011-06-02 186 views
9

我遇到了一個問題,我似乎無法從我在Jquery中運行的異步JavaScript方法獲取值。我的jQuery的是這樣的:從異步JavaScript方法返回值?

$(document).ready(function() { 
$('#splash_image_upload').change(function() { 
    var file = this.files[0]; 
    var blob_string = create_blob(file); 
    alert(blob_string); 
}); 

我能夠訪問來自「的onload」事件的價值,但我似乎無法返回的實際值。我曾經嘗試這樣做:`

function create_blob(file) { 
    var reader = new FileReader(); 
    reader.onload = (function() { return function(e) { return e.target.result; }; })(); 
    reader.readAsDataURL(file); 
} 

我每次執行此功能,因爲完成該功能前分配完成的「blob_str」變量值「未定義」大概。我不太清楚如何去做這件事。有沒有辦法可以從這個函數返回這個值?

+1

相關:[?如何返回從函數的AJAX調用的響應(http://stackoverflow.com/questions/14220321 /如何返回a-ajax函數調用) – Bergi 2013-04-02 13:26:55

回答

22

你最好的賭注是一個回調傳遞給create_blob,讓回調做任何需要做的事情,這樣的事情:

create_blob(file, function(blob_string) { alert(blob_string) }); 

function create_blob(file, callback) { 
    var reader = new FileReader(); 
    reader.onload = function() { callback(reader.result) }; 
    reader.readAsDataURL(file); 
} 

這類詐騙的是異步調用相當標準(AJAX特別)。你可以連接一些脆弱的定時器,試圖同步進行強制,但是與API的自然風格戰鬥是一場失敗的戰鬥。

+0

謝謝。我從未想過。我只是認爲你可以在onload()函數內返回值,但是這個函數又是異步的,所以它在函數完成前返回!非常感激! – Kevin 2011-06-02 16:37:45

0

這是回調問題。 「答案」將在另一個時刻晚些時候發生,而不是在評估該方法的過程中。這裏沒有什麼用處。

你的回調需要處理的返回值使得代碼看起來更加複雜:

reader.onload = function(e) { 
    // handle here the result 
    // do something with e.target.result 
};