Индексированная БД получает все значения, переменная не присваивает значения - Асинхронная ошибка

Я пытаюсь получить все данные из indexeddb с помощью следующей функции.

var databasehandler={}
 databaseHandler.getAllContacts=function(callback){
var resultarray = new Array;
var objectStore = db.transaction(databaseHandler.TABLE_CONTACTS).objectStore(databaseHandler.TABLE_CONTACTS);
          var keyRange = IDBKeyRange.lowerBound(0);
         objectStore.openCursor(keyRange).onsuccess = function(event) {
           var cursor = event.target.result;
           //console.log("valueee:"+event.target.result);

           if (cursor) {
               resultarray.push(cursor.value);
              //console.log("Name for id " + cursor.key + " is " + cursor.value.name + ",  Age: " + cursor.value.age + ", Email: " + cursor.value.email);
              cursor.continue();
           } else {
              console.log("No more entries!");
           }
        };
    callback(resultarray);
}

и вызвать функцию, используя

var allcontacts;
        databaseHandler.getAllContacts( function(data){allcontacts=data});
        if(allcontacts.length>0){
            console.log('higher' +allcontacts[0]);
            }else{console.log('lower');
                }

поэтому мне нужно получить длину всех данных. если 3 данные там, он должен напечатать выше и первые данные.. но я получаю

    TypeError: allcontacts is undefined[Learn More]

я знаю.onsuccess - это асинхронная функция, поэтому я попытался вызвать метод обратного вызова. и даже я пытался использовать "$.Deferred()", как это:

databaseHandler.getAllContacts=function(){
var resultarray = new Array;
var defer = $.Deferred();
var objectStore = db.transaction(databaseHandler.TABLE_CONTACTS).objectStore(databaseHandler.TABLE_CONTACTS);
         var keyRange = IDBKeyRange.lowerBound(0);
         objectStore.openCursor(keyRange).onsuccess = function(event) {

           var cursor = event.target.result;
           //console.log("valueee:"+event.target.result);

          if(!!cursor == false) {
     // Send the information back to our specified function
    // Callback(resultarray);
    defer.resolve(resultarray);
     return
  }
  resultarray.push(cursor.value);

  cursor.continue();
        };

}

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

databaseHandler.getAllContacts=function(Callback){
var resultarray = new Array;
var defer = $.Deferred();
var objectStore = db.transaction(databaseHandler.TABLE_CONTACTS).objectStore(databaseHandler.TABLE_CONTACTS);
         var keyRange = IDBKeyRange.lowerBound(0);
         objectStore.openCursor(keyRange).onsuccess = function(event) {

           var cursor = event.target.result;
           //console.log("valueee:"+event.target.result);

          if(!!cursor == false) {
     // Send the information back to our specified function
     Callback(resultarray);

     return
  }
  resultarray.push(cursor.value);

  cursor.continue();
        };

}

0 ответов

Другие вопросы по тегам