处理递归异步调用中的回调



我使用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不工作,因为它在完成之前被调用。

(免责声明:我为JayData工作)

要等待整个进程的完成,你需要使用promise。你总是要回报承诺的。在循环中,它变得棘手,返回一个超级承诺。所以代码应该是这样的:

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
});

备注:

  1. 这个例子使用jQuery承诺,所以你需要jQuery 1.8+美元。当使用变量时,我们需要apply

  2. 这可以用稍微不同的语法与q promise一起工作

这个伪代码在你的情况下有意义吗?

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和最后一个回调

的累加器调用此帮助器。

相关内容

  • 没有找到相关文章

最新更新