2014-09-23 36 views
0

我正在試驗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"); 
    } 
}; 

我的指令序列擴展這樣的:

  1. application.indexedDB.open()
  2. 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/

謝謝

+0

只是爲了您的信息,有一個名爲IDBWrapper的庫,它包含了複雜性並提供了處理IndexedDb的便捷方法。瞭解更多信息:http://jensarps.github.io/IDBWrapper/ – 2014-09-23 20:05:41

+0

我會推薦一個在indexDB上使用的工具,因此您不必處理儘可能多的低級編碼。 pouchDB是一個很好的,甚至是jQeury之一。您還可以研究創建承諾包裝,這將允許您以傳統的自上而下的方式進行編碼。 – dandavis 2014-09-23 20:08:02

+0

ConstraintError意味着您正在嘗試使用現有密鑰添加數據。嘗試重命名你的數據庫,它不會給你任何錯誤 – Tengiz 2014-09-23 20:26:13

回答

0

我所普遍採用的模式是等待所有的數據庫操作,直到連接。這與jQuery中的$.ready類似。

你會發現,隨着應用程序變老,你有很多模式版本,並且需要升級數據。數據庫連接本身有很多邏輯。

如果您需要在準備就緒之前使用數據庫,則可以使用回調隊列。下面是從谷歌分析片斷上commend queue

// Creates an initial ga() function. The queued commands will be executed once analytics.js loads. 
i[r] = i[r] || function() { 
    (i[r].q = i[r].q || []).push(arguments) 
}, 

基本上,一旦數據庫連接將執行這些回調。

我強烈建議看看我自己的圖書館,ydn-db。它具有所有這些概念。

2

你不需要使用別人的額外程序。在使用indexedDB之前,您需要了解異步JavaScript(AJAX)。沒有辦法避免它。您可以在不瞭解indexedDB的情況下了解AJAX。例如,看看XMLHttpRequest是如何工作的。瞭解setTimeout和setInterval。也許瞭解requestAnimationFrame。如果你知道nodejs的東西,查看process.nextTick。瞭解功能如何成爲頭等艙。瞭解使用回調函數的想法。瞭解延續傳球風格。

你可能不會得到你正在尋找這個問題的答案。如果有的話,這是在javascript中關於異步編程的堆棧溢出的數千個其他問題的重複。它甚至與indexedDB沒有關係。看看關於異步js的許多其他問題。

也許這可以讓你開始:

var a; 
setTimeout(function() { a = 1; }, 10); 
console.log('The value of a is %s', a); 

弄清楚爲什麼沒有奏效。如果你這樣做,你會更接近找到這個問題的答案。