Promesses récursives?
Je tiens à itérer sur tous les fichiers situés dans le HTML 5 de système de fichiers et les avoir certains événements de commencer une fois que l'itération est terminée. Puisque c'est async + promet je vais avoir un moment difficile essayer de comprendre la façon dont il devrait fonctionner.
Je suis à l'aide d'un angularJS et ont créé un service d'encapsuler html 5 de système de fichiers de caractéristiques spécifiques.
C'est la fonction récursive:
function walkDirectory(path) {
fileSystem.getFolderContents(path) //this is the services and it returns a promise containing all files in the current folder or directory
.then(function(entries) {
for (var i = 0; i < entries.length; i++) {
if(entries[i].isFile) {
console.log("is File: " + entries[i].name);
//do something with file here
}
else if (entries[i].isDirectory) {
console.log("is Dir: " + entries[i].name);
walkDirectory(entries[i].fullPath);
}
}
});
};
idéalement, je voudrais appeler la fonction comme, et le retour d'une promesse qui sera exécuté une fois que tous les fichiers ont été parcourus.
walkDirectory("/").then( function() {
console.log(done);
});
Des conseils/idées de comment cela peut être réalisé?
une idée serait d'avoir un tableau de promesses et d'ajouter une nouvelle promesse pour le tableau pour chaque fichier/répertoire. Ma tentative:
function walkDirectory(path) {
var defer= $q.defer();
var promises = [defer.promise];
fileSystem.getFolderContents(path)
.then(function(entries) {
for (var i = 0; i < entries.length; i++) {
if(entries[i].isFile) {
console.log("is File: " + entries[i].name);
//do something with file here
defer.resolve();
promises.push(defer.promise);
}
else if (entries[i].isDirectory) {
console.log("is Dir: " + entries[i].name);
promises.push(walkDirectory(entries[i].fullPath));
}
}
});
return $q.all(promises);
};
walkDirectory("/").then(function() {
console.log("done");
});
Cela ne semble pas fonctionner puisque le fait n'est jamais affiché dans la console.
source d'informationauteur BuildingJarl
Vous devez vous connecter pour publier un commentaire.
Vous êtes de retour le tableau avant de le remplir.
Au lieu de cela, vous avez besoin de retourner
$q.all(promises)
dans lethen()
de rappel, et de retour à l'extérieur promesse: