我正在試驗indexedDB。現在一切都像異步,並且傷害了我的大腦。indexedDB正確的用法
我創造了這樣一個對象:
var application = {};
application.indexedDB = {};
application.indexedDB.db = null;
application.indexedDB.open = function() {
var dbName = "application";
var dbVersion = 1;
var openRequest = indexedDB.open(dbName, dbVersion);
openRequest.onupgradeneeded = function(e) {
console.log("Upgrading your DB (" + dbName + ", v" + dbVersion + ")...");
var thisDB = e.target.result;
if (!thisDB.objectStoreNames.contains("journal")) {
thisDB.createObjectStore(
"journal",
{keyPath: "id"}
);
}
}
openRequest.onsuccess = function(e) {
console.log("Opened DB (" + dbName + ", v" + dbVersion + ")");
application.indexedDB.db = e.target.result;
}
openRequest.onerror = function(e) {
console.log("Error");
console.dir(e);
}
};
現在我能夠與application.indexedDB.open()
打開DBConnection的。現在,我又增加了功能,我的對象:
application.indexedDB.addItemToTable = function(item, table) {
var transaction = application.indexedDB.db.transaction([table], "readwrite");
var store = transaction.objectStore(table);
//Perform the add
var request = store.add(item);
request.onerror = function(e) {
console.log("Error", e.target.error.name);
//some type of error handler
}
request.onsuccess = function(e) {
console.log("Woot! Did it");
}
};
我的指令序列擴展這樣的:
application.indexedDB.open()
application.indexedDB.addItemToTable(item, "journal")
但是,這是行不通的。由於開放指令是異步的,當我在addItemToTable-Function中調用它時,application.indexedDB.db
尚不可用。 Javascript-Developer如何解決這個問題?
我在這裏按照這個教程:http://code.tutsplus.com/tutorials/working-with-indexeddb--net-34673現在我有這些例子的一些問題。
例如,他直接在「onsuccess」部分(在「Read More Data」部分中)創建HTML輸出。在我看來,這是糟糕的編碼,因爲這個視圖與db-reading部分無關。不是嗎?但隨後出現我的問題。你怎麼能在「成功」中返回一些東西 - 部分? 添加回調函數有點複雜。特別是當我想讀取一些數據,並用該結果集獲得更多的數據。描述我的意思非常複雜。 我犯了一個小小提琴 - 這可能是澄清的東西.. - http://jsfiddle.net/kb8nuby6/
謝謝
只是爲了您的信息,有一個名爲IDBWrapper的庫,它包含了複雜性並提供了處理IndexedDb的便捷方法。瞭解更多信息:http://jensarps.github.io/IDBWrapper/ – 2014-09-23 20:05:41
我會推薦一個在indexDB上使用的工具,因此您不必處理儘可能多的低級編碼。 pouchDB是一個很好的,甚至是jQeury之一。您還可以研究創建承諾包裝,這將允許您以傳統的自上而下的方式進行編碼。 – dandavis 2014-09-23 20:08:02
ConstraintError意味着您正在嘗試使用現有密鑰添加數據。嘗試重命名你的數據庫,它不會給你任何錯誤 – Tengiz 2014-09-23 20:26:13