0

只需尝试编写一个“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,我认为 Promise 可能是答案。特别是, $q.all() 在这种情况下会有所帮助吗?

4

1 回答 1

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 时围绕回调调用。

于 2013-11-14T14:27:36.603 回答