2014-10-06 31 views
1

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

我的数据库架构包含一个tasks店,像这样:

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

给定的任务ID数组,我需要检索所有对应于那些IDS的任务。我有一个工厂“DB”服务与数据层处理,和我使用的承诺,使异步调用:

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一个。

示例:要获取4个任务,我的代码是:

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 我怎么能串联多个,无限异步调用,并返回一个包含所有结果的单一的承诺?

问题2 如何有效地对keyPath场or子句查询IndexedDB的。确实这个问题值得它自己的问题

谢谢。

+0

我想你应该问两个不同的问题。 – Bergi 2014-10-06 23:38:51

回答

1

您可以在$ q.all方法旁边使用Array.prototype.map方法。这应该为每个taskIds创建承诺,并在解决所有问题后触发$ q.all的回调。

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

谢谢,它的工作! – Lucian 2014-10-07 12:31:06