2013-06-26 4 views
0

Я пытаюсь поместить данные из базы данных в переменную. Я пробовал много вещей, в том числе функцию обратного вызова, но ничего не работает, если этот процесс выходит за пределы области действия «opencursor(). Onsuccess».Поместите данные из базы данных IndexedDB в переменную

«Alert 1» показывает результат правильно, но «Alert 2» и «Alert 3» этого не делают.

Я вызываю функцию main() из кода HTML.

Я действительно расстроен, потому что я добываю интернет, ища решение без какого-либо положительного результата.

Может кто-нибудь мне помочь, пожалуйста?

Большое спасибо.

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); 
} 

ответ

1

Исправить. Поскольку все действия IndexedDB являются асинхронными, ваш код будет работать:
предупреждение 2 // неопределенный
предупреждение 3 // неопределенный
оповещение 1 // правильно

Для того, чтобы получить это ближе к синхронному действию, вам нужно чтобы он вызывал новую функцию после того, как она собирала данные. Где находится ваш alert("No more entries!").

+0

Благодарим за быстрый ответ. Проблема заключается в решении выбрать IndexedDB по W3. Это то, что у нас есть. :) –

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 
}); 
+0

Хороший способ. Это немного заставляет за мои потребности, но я вижу, что это единственный способ. Спасибо. –