web-dev-qa-db-fra.com

plusieurs `.then ()` s sur une seule promesse angularjs - tous utilisent des données _original_

J'écris une application angularjs en me basant sur des promesses, et bien que cela fonctionne, je me demande si je pourrais le faire de manière plus optimale.

Au début du code, je crée une promesse qui va chercher des données. Lorsque cela est fait, je veux exécuter plusieurs fonctions qui utilisent toutes ces données. Les fonctions sont attachées à des parties non liées de l'application, donc je ne connais pas l'ordre dans lequel elles sont attachées à la promesse. Ils ne doivent pas non plus être effectués en séquence.

app.service("Fetch", function ($q){
    return function() {
        var def = $q.defer();
        somelibrary.asynccall(function(error, data){ //callback
            if (error) def.reject(error);
            else def.resolve(data);
        });
        return def.promise;
    };
});

app.controller("ctrl", function ($scope, Fetch) {
    var prom = Fetch();

    //somewhere:
    prom.then(function(data){$scope.var1 = data["VAR1"];});
    //somewhere else:
    prom.then(function(data){$scope.var2 = data["VAR2"]});
});

Le principal inconvénient ici est que les thens ultérieurs ne sont exécutés que lorsque les précédents sont terminés, ce qui n'est pas nécessaire ici.

De plus, je dois ajouter return data À l'intérieur de chaque function(data){...}, sinon la then() suivante n'a pas le data disponible.

N'y a-t-il pas une autre façon de procéder, plus adaptée à cette situation?


EDIT: comme mentionné par @ jfriend00, je me suis trompé; en fait, les 2 fonctions s'exécutent toutes les deux en parallèle, dès que la promesse est résolue avec succès, et elles ne sont pas enchaînées et donc ne dépendent pas l'une de l'autre. Merci de votre aide

46
ElRudi

Transformer mon commentaire en réponse car il semble éclaircir le problème:

Avec votre modèle, les deux appels .then() sur la même promesse vont être appelés l'un après l'autre lorsque la promesse est résolue. La deuxième .then() n'a qu'à voir avec la promesse d'origine et n'a rien à voir avec ce qui se passe sur la première .then().

Ceux-ci ne sont pas enchaînés donc la deuxième .then() n'a aucune dépendance sur ce qui est retourné par la première .then() et les deux recevront les mêmes données. Ce ne sont que plusieurs observateurs de la même promesse, comme deux gestionnaires d'événements écoutant le même événement.

Les deux gestionnaires .then() sur la même promesse seront appelés dans l'ordre où ils ont été attachés à la promesse et recevront tous deux les mêmes données.

Voir ces deux réponses:

Y a-t-il une différence entre promise.then.then vs promise.then; promise.then

Comprendre les promesses javascript; les piles et le chaînage

pour plus d'informations sur chaînage p.then(...).then(...) vs branchement p.then(...); p.then(...) avec des promesses.

76
jfriend00

Vous avez besoin d'une exécution parallèle: $ q.all ()

$q.all(
    function1,
    function2,
    function3
).then(function(responses) {
    console.log(responses);
});
3
monkeyinsight