Вернуть все значения из objectStore базы данных indexedDB

Просто попытайтесь написать метод selectAll, который принимает имя objectStore в качестве параметра и возвращает ВСЕ содержащие его пары ключ/значение, а не просто запускает обратный вызов на каждой итерации хранилища объектов.

По сути, имитируя синхронное поведение при выполнении транзакции 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() помочь в этом случае?


person james    schedule 14.11.2013    source источник


Ответы (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 в качестве параметра, затем вызывающая функция вернула обещание вызывающей функции IT...

db.selectAll(model, function(results) {
    deferred.resolve(results);
})

Важно отметить

$rootScope.$apply(function() {

вокруг обратного вызова при использовании Angular.

person james    schedule 14.11.2013
comment
Другой возможностью является использование обратного вызова oncomplete объекта транзакции. - person Kristof Degrave; 15.11.2013