Връща всички стойности от indexedDB база данни objectStore

Просто се опитвате да напишете метод „selectAll“, който приема името на objectStore като параметър и връща ВСИЧКИ съдържащи се двойки ключ/стойност, вместо просто да изпълнява обратно извикване при всяка итерация на хранилището на обекти.

По същество, имитиране на синхронно поведение при извършване на транзакция с индексирана DB.

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'S извикващата функция...

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