2011-08-08 76 views
1

我試圖在Firefox 5.0以下:問題而值分配給JavaScript變量

var db; 
var request = mozIndexedDB.open("MyTestDatabase"); 
request.onerror = function(event) { 
    alert("Why didn't you allow my web app to use IndexedDB?!"); 
}; 
request.onsuccess = function(event) { 
    db = request.result; 
    //db = event.target.result; //also tried this 
    console.log(db); //get the object 
}; 

console.log(db); //undefined 

我想分貝,處理程序外部訪問。這裏有什麼問題? 我想從this中學到一些東西。

必須有,我缺少一個簡單的事情..

回答

3

db變量分配成功處理程序中的值:

request.onsuccess = function(event) { 
    db = request.result; 
    //db = event.target.result; //also tried this 
    console.log(db); //get the object 
}; 

該處理器會被異步調用,特別是,它並沒有被執行此操作時稱爲:

console.log(db); //undefined 

所以你最終得到var db;的初始值db

因此,您可以在回調之外訪問db,但在您需要時它不一定具有有用的值。通常的做法是在成功處理程序中調用需要db的事物。如果您需要在其他地方使用db,則必須在使用之前檢查它是否已定義,如果不是,請等待。

如果您需要等待db能與您的應用程序繼續之前準備好,然後這樣的事情應該工作:

var timer = setInterval(function() { 
    if(!db) // Not ready yet. 
     return; 
    // We have a db so we can stop waiting 
    clearInterval(timer); 
    // and get on with our real work. 
    start_main_application(); 
}, 100); 

setInterval將觸發0.1秒每次檢查是否有db之中;如果不是,那麼直到下一次間隔被觸發纔會執行任何操作;如果有db,那麼它shuts down the timer並啓動主應用程序。

+0

如何檢查處理程序是否執行了該函數? – Vikas

+0

我們可以做一個等待循環來進一步執行嗎? – Vikas

+0

@Vikas:請參閱我的更新。 –

0

看來,請求不會將結果變量本身(即request.result)。

函數(事件)中的參數可能具有「結果」值。

1
console.log(db); //undefined 

當然,在那裏沒有定義,這是正確的行爲。

請看,發生了什麼:您正在執行請求,並提交處理該請求的處理程序(onsuccess)。初始化發生在處理程序主體中,但事件尚未發生!代碼流轉到console.log(db);行,但db不是初始化的,因爲處理程序尚未被調用。

只要onsuccess發生,處理程序就會被調用並且db已初始化。只有在那之後,你才能使用它。