2014-01-14 77 views
2

我想遍歷html5文件系統,並在所有文件都被遍歷後收到某種通知。Angular JS中的遞歸承諾

進出口使用filer這是HTML文件系統庫的包裝

爲了以此來啓動遞歸文件系統沃克IM:

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

任何人都有一些關於如何實現這一目標的指針?

回答

3

它可以使用承諾數組(每個子目錄一個)和$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()將迭代根。

正如我所說這是未經測試,可能需要調整,但它表明(我認爲)的解決方案的大綱。

+0

是的完美,謝謝這有助於我把事情的角度。 – BuildingJarl

+0

不幸的是它不能按預期工作。一旦遍歷所有文件,我似乎無法得到承諾。 – BuildingJarl

+0

我們可以制定詳細信息,如果你可以提供一個小提琴/ plunk ... –