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