2010-07-28 135 views
1

我遇到條件符合條件之前執行的if語句中的行有問題。我想要做的是:Javascript/jQuery操作順序

  1. 檢查是否已加載數據(大的舊數組數組)。
  2. 如果沒有得到它並將其加載到我的all_data對象中。
  3. 情節數據(或在這種情況下,提醒它)

下面的代碼(剝離的很多細節是可讀的

var all_data={}; 

function get_data(name,rid) { 
    if (!all_data[name]) { 
     return $.get('/data.json', 
        {'name':name}, 
        function(data) {all_data[name]=data;}, 
        "json"); 
    } else {return true} 
} 

function load_file(name,rid) { 
    if (get_data(name,rid)) { alert(all_data[name]) }; 
} 

與上面的代碼會發生什麼事是,當我執行GET_DATA它立即提醒「未定義」,因爲jQuery.get返回一個(尚未完成的)請求對象。此時,條目all_data [name]是未定義的。如果我等待~5s,get請求完成,再次運行代碼將只是警告「[Object Object]」,因爲數據已經加載,我意識到我可以在$ .get回調函數中加入一個函數else語句,但這會使這不再泛化。有什麼想法嗎?

克里斯

回答

2

通行證需要發生數據是否被加載的回調函數,load_file本身的東西。這是一個通用解決方案,因爲如果數據已經可用,則立即調用回調,否則在數據可用時調用回調。

也試圖消除在每個函數中使用全局狀態all_data。儘可能將範圍限制在每​​個功能的本地範圍內。

還有其他方法可以提供流暢的界面,但是在加載數據後不知道數據是如何處理的,很難提出建議。然後

function load_file(name, rid, fn) { 
    get_data(name, rid, fn); 
} 

load_file("..", "..", function() { 
    alert(all_data[".."]); 
}); 

get_data函數變爲:

function get_data(name, rid, fn) { 
    if (!all_data[name]) { 
     return $.get('/data.json', 
        {'name':name}, 
        function(data) { all_data[name]=data; fn(); }, 
        "json"); 
    } else { fn(); } 
} 
0

正如其他人所說,這個問題是,$獲得()函數是異步的,其立即返回。您可以使用下面的方式創建同步請求,並執行預期的操作。

function get_data(name,rid) { 
if (!all_data[name]) { 
    var result = $.ajax({ async: false, 
       url: '/data.json', 
       data: {'name':name}, 
       dataType: "json" 
       }); 
    all_data[name] = result; 

    return result; 

} else {return true} 

}

的「異步:假」設置將導致請求是同步的,並且不會繼續,直到接收到從URL的響應。