我使用Jaydata作为HTML5 indexedDB的API。我在indexedDB中有一个表,我需要递归查询。整个过程完成后我需要回调。以下是递归函数。一切都完成后我需要回调。
function getData(idValue) {
myDB.MySplDB
.filter( function(val) {
return val.ParentId == this.parentId;
}, {parentId: idvalue})
.toArray( function(vals) {
if(vals.length < 1) {
// some operation to store the value
} else {
for (var j=0;j<vals.length;j++) {
getData(vals[j].Id);
}
}
});
}
将.done(function(){...});
添加到.toArray
不起作用,因为它在完成之前被调用。
答案 0 :(得分:1)
(免责声明:我为JayData工作)
要等待整个过程的完成,您需要使用promises。你总是要回复一个承诺。在循环中它变得棘手,返回一个超级承诺。所以代码应该是这样的:
function getData(idValue) {
return myDB.MySplDB
.filter( function(val) {
return val.ParentId == this.parentId;
}, {parentId: idvalue})
.toArray( function(vals) {
if(vals.length < 1) {
// some operation to store the value
// important: return a promise from here, like:
return myDB.saveChanges();
} else {
var promises = [];
for (var j=0;j<vals.length;j++) {
promises.push(getData(vals[j].Id));
}
return $.when.apply(this, promises);
}
});
}
getData(1)
.then(function() {
// this will run after everything is finished
});
说明:
这个例子使用jQuery promises,所以你需要jQuery 1.8+ $。当使用varargs因此我们需要apply
这可以与q promise一起使用,语法略有不同
答案 1 :(得分:0)
这个伪代码会对你的情况有意义吗?
var helper = function (accu) {
// Take an id from the accumulator
// query the db for new ids, and in the db query callback :
// If there is child, do "some operation to store the value" (I'm not sure what you're trying to do here
// Else add the child to the accumulator
// if accu is empty, call the callback, it means you reached the end
getData()会使用包含第一个id和最终回调的累加器来调用此帮助程序