【问题标题】:Recursive promises in Angular JSAngular JS 中的递归承诺
【发布时间】:2014-02-02 18:38:20
【问题描述】:

我想遍历 html5 文件系统,并在遍历完所有文件后收到某种通知。

我正在使用filer,它是 html 文件系统库的包装器

为了使用这个来启动递归文件系统walker:

filerService.ls(filerService.fs.root, function(entries){
  for(var i = 0; i < entries.length; i ++) {
    traverseFileTree(entries[i]);
  }
});

递归函数:

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

现在我想做以下事情:

var promise = walkFileTree() //this method should start the recursive methods and return a promise

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

有人对如何实现这一点有一些建议吗?

【问题讨论】:

    标签: javascript html angularjs promise q


    【解决方案1】:

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

    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() 将迭代根。

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

    【讨论】:

    • 是的,完美,谢谢,这有助于我正确看待事情。
    • 不幸的是,它没有按预期工作。一旦遍历了所有文件,我似乎无法得到解决的承诺。
    • 由于存在一些依赖项,例如文件管理器和 html 5 文件系统,我似乎无法让 plunk/fiddle 发挥得很好。我一直在用你给我的代码尝试各种事情。问题是 $q.all(promises) 提前实现。这意味着在遍历 1-2 个目录之后,所有的承诺似乎都已实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2015-05-15
    • 2018-05-29
    • 1970-01-01
    • 2016-06-21
    • 2015-11-27
    相关资源
    最近更新 更多