0

我试图将从数据库中读取的数据放入一个变量中。我尝试了很多东西,包括回调函数,但是当进程超出“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);
}
4

2 回答 2

1

与其尝试返回键,不如传入一个自定义回调函数,该函数将检索到的键作为其参数。

// 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
});
于 2013-06-27T01:05:50.607 回答
1

正确的。因为所有 indexedDB 操作都是异步的,所以您的代码将运行:
alert 2 // undefined
alert 3 // undefined
alert 1 // 正确

为了使它更接近同步动作,您需要让它在完成收集数据后调用一个新函数。你在哪里alert("No more entries!")

于 2013-06-26T22:50:35.040 回答