angulaire q$, Comment la chaîne de multiples promesses à l'intérieur et après une boucle for

Je veux avoir une boucle qui appelle async fonctions de chaque itération.

Après la boucle for je veux exécuter un autre bloc de code, mais pas avant que tous les précédents appels dans la boucle for, ont été résolues.

Mon problème est à l'heure actuelle, que ce soit le code-bloc après la boucle est exécutée avant que tous les appels asynchrones ont fini OU il n'est pas exécuté du tout.

La partie de code avec la boucle FOR et le bloc de code après (pour le code complet, veuillez consulter violon):

[..]
function outerFunction($q, $scope) {
    var defer = $q.defer();    
    readSome($q,$scope).then(function() {
        var promise = writeSome($q, $scope.testArray[0])
        for (var i=1; i < $scope.testArray.length; i++) {
             promise = promise.then(
                 angular.bind(null, writeSome, $q, $scope.testArray[i])
             );                                  
        } 
        //this must not be called before all calls in for-loop have finished
        promise = promise.then(function() {
            return writeSome($q, "finish").then(function() {
                console.log("resolve");
                //resolving here after everything has been done, yey!
                defer.resolve();
            });   
        });        
    });   

    return defer.promise;
}

J'ai créé un jsFiddle qui peut être trouvé ici http://jsfiddle.net/riemersebastian/B43u6/3/.

Au moment où il regarde comme l'ordre d'exécution est très bien (voir la sortie de la console).

Ma conjecture est que c'est tout simplement parce que chaque appel de fonction retourne immédiatement sans faire aucun travail réel. J'ai essayé de retarder le reporter.résoudre avec setTimeout, mais a échoué (c'est à dire le dernier bloc de code n'a jamais été exécutée). Vous pouvez le voir dans le outcommented bloc dans le violon.

Lorsque j'utilise les fonctions réelles écriture de fichier et le lire à partir du fichier, le dernier bloc de code est exécuté avant la dernière opération d'écriture finitions, ce qui n'est pas ce que je veux.

Bien sûr, l'erreur peut être dans une de ces fonctions de lecture/écriture, mais je voudrais vérifier qu'il n'y a rien de mal avec le code que j'ai posté ici.

  • (1) Sur les fonctions que vous appelez à partir de l'intérieur de la boucle: - ils ont à exécuter séquentiellement ou sont-ils en parallèle, il reste le dernier bloc à courir après leur avoir fini? Et: (2) Ce qui se passerait si l'un d'entre eux entraîne une erreur?
  • Si vous êtes à l'aide d'une fonction d'écriture, ceux-ci sont souvent asynchrone, donc il est très possible que tout fonctionne "comme prévu."; c'est, angulaire est le coup d'envoi de toutes les écritures (qui ne prend qu'une fraction de temps), mais les écritures elles-mêmes prennent beaucoup de temps. Ce que tu écris, et ce que l'API que vous utilisez?
  • Je n'ai pas vraiment de soins, qu'ils exécutent en parallèle ou séquentiellement, ils pourraient être exécutées en parallèle, car ils ne dépendent pas les uns des autres. Pour l'instant, en chaque intérieur fonction renvoie une promesse et se résout à la fin de l'opération, ce qui signifie qu'ils exécutent en série. Vous l'avez compris, la dernière opération doit toujours être la dernière opération exécutée, regardlesss de savoir si la précédente a couru en parallèle ou en série. (2) une Bonne question, je suppose que certains d'avertissement peut être connecté, mais ce n'est pas si important que cela.
  • Je suis en train d'écrire un JSONObject de fichier et j'utilise les chromes' système de fichiers pour le stockage. Je suppose que la partie la plus importante du problème, c'est que j'résoudre le reporter dans fileWriter.onwriteend, fileWriter.onerror, etc.