2013-05-07 132 views
2

我想有在IndexedDB的加入交易的onSuccess回調函數,但由於某些原因的onSuccess回調永遠不會被調用。我基本上試圖添加一個電影對象到IndexedDb,並在回調中嘗試通過迭代光標來顯示indexedDb中的所有電影。
我希望新添加的電影也會顯示出來。但回調失敗。以下是我的代碼。有人可以讓我知道有什麼問題嗎?的onSuccess和的onComplete回調不工作IndexedDB的補充交易

var movieName=document.getElementById('movieInput').value; 
var movieDataToStore = [{ movieid: "5", name: movieName, runtime:"60"}]; 
var request = indexedDB.open("movies", 1); 
request.onsuccess = function(event) { 
    db = event.target.result; 
    //var transaction = window.db.transaction(["movies"], "readwrite"); 
    //alert(db.transaction("movies").objectStore("movies").add(null)); 
    var requestDataadd=window.db.transaction(["movies"],"readwrite").objectStore("movies").add(movieDataToStore[0]); 
    requestDataadd.onsuccess = function(event) { 
     window.db.transaction("movies").objectStore("movies").openCursor().onsuccess = function(event) { 
      var cursor = event.target.result; 
      if (cursor) { 
       alert("CURSOR: movie: " + cursor.key + " has name " + cursor.value.name); 
       cursor.continue(); 
      } else {//writeLog("CURSOR: No more entries!"); 
       alert("Cursor at the Load Button unabe to open"); 
      } 
     }; 
    }; 
}; 

回答

3

您正在使用兩個事務。由於第二個事務是在第一個事務完成之前創建的,因此它們都獲得了初始狀態的快照。

你必須重新使用第一筆交易或等待,直到它完成,開始第二次交易。這裏是重複使用交易:

var tx = window.db.transaction(["movies"],"readwrite"); 
var requestDataadd = tx.objectStore("movies").add(movieDataToStore[0]); 
requestDataadd.onsuccess = function(event) { 
    tx.objectStore("movies").openCursor().onsuccess = function(event) { 
     var cursor = event.target.result; 
     if (cursor) { 
      alert("CURSOR: movie: " + cursor.key + " has name " + cursor.value.name); 
      cursor.continue(); 
     } else {//writeLog("CURSOR: No more entries!"); 
      alert("Cursor at the Load Button unabe to open"); 
     } 
    }; 
}; 
+0

非常感謝您的答覆。 – 2013-11-25 00:25:04

0

您是否收到警告「光標在載入按鈕不可打開」?

乍一看,我認爲問題在於requestDataadd請求失敗,因爲您已經在(成功)之前插入了一次該對象,因此您將得到一個重複的鍵錯誤。但是您沒有爲requestDataadd請求定義的onerror偵聽器。

但是,如果requestDataadd的onsuccess監聽器實際上被調用(並且您收到警報),情況就不會如此。

我也看到你不必爲openCursor要求定義的onerror聽衆。您可能想要改變這一點以獲得更多見解。通常,您應該始終同時定義處理程序onerroronsuccess