2013-10-15 39 views
-1

時無法調用未定義的方法「交易」我有讓記錄從索引資料對鉻30遺漏的類型錯誤:使用IndexedDB的

var IndexedDBStorage = function (name) { 
// until we won't need this prefix mess 
var indexedDB = window.indexedDB || window.webkitIndexedDB 
    || window.mozIndexedDB || window.msIndexedDB; 
var IDBTransaction = window.IDBTransaction || 
    window.webkitIDBTransaction; 
var db; 
// The initialization of our stuff 
this.Supported = function() { 
    return indexedDB; 
}; 
this.type = function() { 
    return "IndexedDB"; 
}; 
this.Setup = function() { 
    var dbVersion = 1.0; 
    var openRequest = indexedDB.open(name, dbVersion); 

    //handle setup - as the spec like it 
    openRequest.onupgradeneeded = function (e) { 
     console.log("running onupgradeneeded"); 
     var thisDb = e.target.result; 
     if (!thisDb.objectStoreNames.contains(name)) { 

      var objectStore = thisDb.createObjectStore(name, { 
       autoIncrement: false 
      }); 
      objectStore.createIndex("dataKey", "dataKey", 
       { unique: false }); 
     } 
    }; 

    openRequest.onsuccess = function (e) { 
     db = e.target.result; 
     db.onerror = function (event) { 
      alert("Database error: " + event.target.errorCode); 
      console.dir(event.target); 
     }; 
     if (db.setVersion) { 
      console.log("in old setVersion: " + db.setVersion); 
      if (db.version != dbVersion) { 
       var req = db.setVersion(dbVersion); 
       req.onsuccess = function() { 
        var ob = db.createObjectStore(name, { 
         autoIncrement: false 
        }); 
        ob.createIndex("datakey", 
         "datakey", { unique: false }); 
        var trans = req.result; 
        trans.oncomplete = function (ex) { 
         console.log("== trans oncomplete =="); 

        }; 
       }; 
      } 
     } 
     console.log(db); 

    }; 
}; 
this.GetAll = function (callback) { 
    console.log(db); 
    var transaction = db.transaction([name]); <-- gives error described below 
    var store = transaction.objectStore(name); 
    var items = []; 

    transaction.oncomplete = function (evt) { 
     callback(items); 
    }; 

    var cursorRequest = store.openCursor(); 
    cursorRequest.onerror = function (error) { 
     console.log(error); 
    }; 

    cursorRequest.onsuccess = function (evt) { 
     var cursor = evt.target.result; 
     if (cursor) { 
      items.push({ key: cursor.key, body: cursor.value.body }); 
      cursor.continue(); 
     } 
    }; 
}; 


}; 

如果我從這樣的一個按鈕來調用它下面的代碼: 它如果我做這樣和一個按鈕,點擊調用它正常工作,它工作得很好:

function Init() { <-- called from script tag in index.html 
$(document).ready(function() { 

    window.dataStore = new Store("data"); 

}); 
} 

function getAll() { <-- button lick function 
window.dataStore.getAll(); 
} 

但是,如果我喜歡這個

初始化後直接調用它

我得到 遺漏的類型錯誤一個錯誤:無法調用未定義

我猜測這是因爲DB變量尚未從全球openRequest.onsuccess設置方法「交易」時,我初始化後直接調用。

我怎樣才能解決這一問題,以便它被正確設定

回答

1

這是由於該索引資料庫API的異步行爲。

因爲尚未調用onsucces,所以尚未分配db變量。爲了解決這個問題,你必須在openrequest上調用onsuccess時提供一個回調,或者只要db變量未定義,就必須延遲getAll調用的執行。