将IndexedDB数据库中的数据放入变量中

时间:2013-06-26 22:38:47

标签: javascript html5 indexeddb

我正在尝试将数据库中读取的数据放入变量中。我尝试了很多东西,包括一个回调函数,但是当进程在“opencursor()。onsuccess”函数范围之外时,没有任何东西可以工作。

“警报1”正确显示结果,但“警报2”和“警报3”不显示。

我正在用HTML代码调用'main()'函数。

我真的很沮丧,因为我一直在寻找解决方案,没有任何积极的结果。

有人可以帮助我吗?

非常感谢。

var data=[];

function kkeyget(t1, db_name, db_version)
{
    var request = indexedDB.open(db_name, db_version);
    request.onerror=function()
    {
     alert("Error");
    }    
    request.onsuccess=function(event)
    {
    var db=this.result; 
    var trans = db.transaction(t1, "readonly");
    var objectStore = trans.objectStore(t1);
    objectStore.openCursor().onsuccess = function(event) 
    {
        var cursor = event.target.result;
        if (cursor) 
        {
         data.push(cursor.value);

         //Alert 1:
         alert(data[0].id);

         cursor.continue();
        }
        else alert("No more entries!");
    };
    }

    //Alert 2:
    alert(data[0].id);
} 

function main()
{
kkeyget("agenda", "example_db", 1);

//Alert 3:
alert(data[0].id);
}

2 个答案:

答案 0 :(得分:1)

正确。由于所有indexedDB操作都是异步的,因此您的代码将运行:
警报2 //未定义
警报3 //未定义
警告1 //正确

为了使其更接近同步动作,您需要在收集数据后调用新函数。您alert("No more entries!")的位置。

答案 1 :(得分:0)

不是尝试返回密钥,而是传入一个自定义回调函数,该函数将检索到的密钥作为参数。

// Your old function slightly modified
function kkeyget(t1, db_name, db_version, callback, fallback) {
 // ... yada yada yada
 objectStore.openCursor().onsuccess = function(event) {
   var cursor = event.target.result;
   if(cursor) {
     callback(cursor.value);
   } else {
     fallback();
   }
 }
}


// Now in your calling code:
kkeyget('a','b',1, function(id) {
  // Do something with the 'id'
  // here in this anonymous function callback
}, function() {
  // Do something here to indicate no match
});