首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角JS中的递归承诺

角JS中的递归承诺
EN

Stack Overflow用户
提问于 2014-01-14 16:01:15
回答 1查看 2K关注 0票数 2

我想遍历一个html5文件系统,并在遍历完所有文件后发出某种通知。

我使用滤片器,它是html文件系统库的包装器

为了启动递归文件系统walker im,可以使用以下方法:

代码语言:javascript
复制
filerService.ls(filerService.fs.root, function(entries){
  for(var i = 0; i < entries.length; i ++) {
    traverseFileTree(entries[i]);
  }
});

递归函数:

代码语言:javascript
复制
function traverseFileTree(item) {

    if(item.isFile) {
         console.log("item is file: " + item.name); 
         //do something with file here

    } else if (item.isDirectory) {
        console.log("item is directory: " + item.name); 

        filerService.ls(item, function(entries) {

            for(var i = 0; i < entries.length; i ++) {
                traverseFileTree(entries[i]);
            }
        }); 
    }
};

现在我想做以下几点:

代码语言:javascript
复制
var promise = walkFileTree() //this method should start the recursive methods and return a promise

promise.then(function(){
  //notify user that the filewalker has completed
})

有人对如何实现这一点有指点吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-14 16:20:34

它可以使用一个承诺数组(每个子目录一个)和$q.all()来完成。解决方案的一个未经测试的大纲将是:

代码语言:javascript
复制
function walkFileTree(item) {
    var d = $q.defer(), promises = [d.promise]; // we need at least one promise because we do not know beforehand the number of included directories
    if( typeof(item) === "undefined" ) item = filerService.fs.root;
    filerService.ls(item, function(entries){
        for(var i = 0; i < entries.length; i ++) {
            promises.push(traverseFileTree(entries[i]));
        }
        d.resolve();
    });
    return $q.all(promises);
}

function traverseFileTree(item) {
    var d = $q.defer();
    if(item.isFile) {
        console.log("item is file: " + item.name);
        //do something with file here
        d.resolve();
        return d.promise;
    }
    else if (item.isDirectory) {
        console.log("item is directory: " + item.name); 

        return walkFileTree(item);
    }
};

注意,walkFileTree(item)将迭代项,而walkFileTree()将迭代根。

正如我所说的,这是未经测试的,可能需要调整,但它演示了(我认为)解决方案的大纲。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21118018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档