Вернуть все значения из базы данных indexedDB objectStore
Просто попробуйте написать метод 'selectAll', который принимает имя объекта-хранилища в качестве параметра и возвращает ВСЕ его пары ключ / значение, а не просто выполняет обратный вызов на каждой итерации хранилища объектов.
По сути, имитация синхронного поведения при выполнении транзакции indexedDB.
var results = []
request.onsuccess = function(e) {
var result = e.target.result;
if (!result) {
//I could call successcallback here with JUST this 'row' of data
successCallback(result);
return;
}
//I could push the results into an array here, but I would need to 'wait' until all the onSuccess methods have fired before returning it.
results.push(result.value);
result.continue();
}
Я использую Angular, я думаю, что обещания могут быть ответом. В частности, может ли $q.all() быть полезным в этом случае?
1 ответ
Решение
На самом деле это была более простая проблема, чем я думал. Я переключил вышеуказанный код на следующий...
function selectAll(model, successCallback) {
...
request.onsuccess = function(e) {
var result = e.target.result;
if (result) {
results.push(result.value);
result.continue();
} else {
$rootScope.$apply(function() {
successCallback(results);
});
}
}
}
В качестве параметра я использовал successCallback, затем вызывающая функция вернула обещание вызывающей функции...
db.selectAll(model, function(results) {
deferred.resolve(results);
})
Важно отметить
$rootScope.$apply(function() {
вокруг обратного вызова при использовании Angular.