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