2014-01-14 3 views
2

Я хочу пройти через файловую систему html5 и получить какое-то уведомление после того, как все файлы пройдены.Рекурсивные обещания в Angular JS

Im использованием filer, который является оболочкой для библиотеки HTML файловой системы

для того, чтобы начать рекурсивной файловой системы ходок им с помощью этого:

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 ... –

Смежные вопросы