我在角项目上使用 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
如何在确实这个问题值得它自己的SO问题keyPath
字段上使用OR子句有效地查询indexedDB。
谢谢。
答案 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
});