javascript - Angular JS 中的递归 promise

标签 javascript html angularjs promise q

我想遍历 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
})

有人知道如何实现这一点吗?

最佳答案

可以使用一系列 Promise(每个子目录一个)和 $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() 将迭代根。

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

关于javascript - Angular JS 中的递归 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118018/

相关文章:

javascript - 在Javascript构造函数中使用 'this'来访问属性

javascript - 无法找到适用于 Highcharts 的正确 JSON 数组语法

html - 如何检查 Html.ValidationSummary 是否有错误?

javascript - NVD3 平行坐标图的重置按钮

javascript - 调用 Promise.all() 时如何提供有关 Promise 的元数据?

jquery - 如何使用 jquery 将背景大小设置为 100%?

html - 需要帮助来制作响应式页脚吗?

javascript - 未定义 JSONP 跨域

javascript - 使用 Flask 时出错 Angular.js

javascript - 带 Angular 多语言网站