链中无限数量的angularjs到IndexedDB的异步调用

时间:2014-10-06 23:36:18

标签: angularjs asynchronous promise indexeddb

我在角项目上使用 IndexedDB 。由于IndexedDB是异步的,我遇到了一些麻烦,链接到数据库的无限数量的异步调用(这听起来很糟糕,我知道:))。

我的数据库架构包含一个tasks商店,如下所示:

var taskStore = db.createObjectStore('task', {
   keyPath: 'id'
});

给定一系列任务ID,我需要检索与这些ID相对应的所有任务。我有一个处理数据层的工厂'db'服务,我正在使用promises来进行异步调用:

angular.module('myapp', []).factory(db, function()){
    return {
        findTaskById: function(taskid){ //retrieves in a promise a single task, by its id
            //...async code, removed for brevity
        }
    };
});

由于IndexedDB不允许我使用'OR'子句进行查询,因此我计划将findTaskById方法的无限次调用链接起来,每个所需的任务ID一个。

示例:要检索四个任务,我的代码将是:

var taskIds = [100,101,102,103];
var results = [];
var deferred = $q.defer();
db.findTaskById(taskIds[0])
    .then(function(task){ 
        results.push(task); 
        return db.findTaskById(taskIds[1])
            .then(function(task2){ 
                results.push(task); 
                   return db.findTaskById(taskIds[2])
                       .then( ... etc
//later in the code, return everything in a single promise
deferred.resolve(results);

如果不首先知道任务ID的数量,上面的代码很糟糕并且无法正常工作。

我的问题是:

问题1 如何链接多个无限制的异步调用并返回包含所有结果的单个promise?

问题2 如何在keyPath字段上使用OR子句有效地查询indexedDB。确实这个问题值得它自己的SO问题

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在$ q.all方法旁边使用Array.prototype.map方法。这应该会创建每个taskIds的promise,并在$ q.all全部解析后触发回调。

var promises = taskIds.map(db.findTaskById);
$q.all(promises).then(function(data) {
    // Do Stuff
});