Dr_Elvis
@Dr_Elvis
В гугле забанен

Как дождаться выполнения функции для получения результата?

У меня есть функция которая делает запрос к IndexedDB и возвращает массив данных
function dbget(table, ind, key){
    let openRequest = indexedDB.open('FV', 6);
    openRequest.onsuccess = function() {
        let db = openRequest.result;
        let transaction = db.transaction(table, 'readonly');
        let labs = transaction.objectStore(table);
        let index = labs.index(ind);
        let request = index.getAll(key);
        request.onsuccess = function() {
            return request.result;
        }
    };
}


далее в коде делаю вызов и дальше перебираю массив
let res = dbget('labs', 'lablvlID', lablvlID);
for(let x of res){
    //do some
}

Так как запрос к IDB идет асинхронно - при вхождении в цикл у меня в переменной res ничего нет.
пробовал сделать функцию асинхронной, но всё равно не возвращается значение вовремя, так как там( как я понимаю) внутри аж 2 асинхронных функции
async function dbget(table, ind, key){
    let openRequest = indexedDB.open('FV', 6);
    openRequest.onsuccess = function() {
        let db = openRequest.result;
        let transaction = db.transaction(table, 'readonly');
        let labs = transaction.objectStore(table);
        let index = labs.index(ind);
        let request = index.getAll(key);
        request.onsuccess = function() {
            let res = request.result;
            return res;
        }
    };
}

dbget('labs', 'lablvlID', 'labkey').then(res => {
    for(let x of res){
        //do some
    }
});


Как мне дождаться выполнения и только потом массив использовать в цикле for?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
RAX7
@RAX7
заверни всё в промис
function dbget(table, ind, key) {
  return new Promise((resolve) => {
    let openRequest = indexedDB.open('FV', 6);

    openRequest.onsuccess = function() {
      let db = openRequest.result;
      let transaction = db.transaction(table, 'readonly');
      let labs = transaction.objectStore(table);
      let index = labs.index(ind);
      let request = index.getAll(key);

      request.onsuccess = function() {
        let res = request.result;
        resolve(res);
      };
    };
  });
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы