web-dev-qa-db-fra.com

Plusieurs fonctions différées chaînées utilisant q dans AngularJS arrêtent de renvoyer des données

J'essaie de chaîner plusieurs appels de fonction différés de telle sorte que le prochain appel obtienne les résultats du précédent deferred.resolve. Lorsque j'enchaîne plus de 2 de ces appels, les données cessent d'être renvoyées.

Voici le code de base à l'intérieur d'un contrôleur angular:

    $scope.runAsync = function() {
        var asyncFn1 = function(data){
            var deferred = $q.defer();

            $timeout(function(){
                console.log("Async fn1 " + data);
                $scope.outputLines.Push("Async fn1 " + data);
                deferred.resolve("Async fn1 " + data);
            },1000);

            return deferred.promise;
        }

        var asyncFn2 = function(data){
            var deferred = $q.defer();

            $timeout(function(){
                console.log("Async fn2 " + data);
                $scope.outputLines.Push("Async fn2 " + data);
                deferred.resolve("Async fn2 " + data);
            },1000);

            return deferred.promise;
        }

        asyncFn1(1)
        .then(function(data){asyncFn2(data)})
        .then(function(data){asyncFn2(data)})
        .then(function(data){asyncFn2(data)});
    }

Lorsque je lance ceci, j'obtiens la sortie suivante:

Async fn1 1
Async fn2 Async fn1 1
Async fn2 undefined
Async fn2 undefined

Comment puis-je les enchaîner afin que le troisième appel obtienne le résultat du deuxième appel et le quatrième le résultat du troisième?

J'ai créé un jsFiddle: http://jsfiddle.net/rhDyL/

32
BoxerBucks

Extrait du doc ​​officiel sur $ q:

puis (successCallback, errorCallback) - quel que soit le moment où la promesse a été ou sera résolue ou rejetée, appelle l'un des rappels de réussite ou d'erreur de manière asynchrone dès que le résultat est disponible. Les rappels sont appelés avec un seul argument le résultat ou la raison du rejet.

Cette méthode renvoie une nouvelle promesse qui est résolue ou rejetée via la valeur de retour de successCallback ou errorCallback.

Et pour la valeur de retour de successCallack ou errorCallback, selon diapositives de Domenic :

si la valeur de retour est une promesse, la promesse adopte l'état de la promesse retournée sinon le rappel de succès est immédiatement appelé avec la valeur de retour

Sur la base de la définition, votre code ne contient pas le mot clé return. Il devrait être le suivant:

    asyncFn1(1)
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn2(data)});
40
tamakisquare