Hello

Je travail actuellement sur un petit projet en angular. J'ai une fonction qui boucle sur N éléments, et j'aurais besoin de déclencher une autre fonction une fois que la boucle est terminée.

J'ai regardé du côté des promises, mais je n'ai pas vu comment faire ça.
Est-ce quelqu'un saurait faire ça ?
Merci :)

7 réponses


Reivax
Auteur

Personne ? ^^

Bonjour,

voila comment utiliser les Promises en AngularJS.

var myApp = angular.module('myApp', []);

myApp.factory('myService', function ($q) {
  return {
    doLoop: function () {
      // creation d'une promise
      var deferred = $q.defer();

      var array = [];

      for (var i = 0; i < array.length; i++) {
        // do stuff
      }

      // resolution de la promise
      // il est aussi possible de la rejeter avec .reject()
      deferred.resolve(array);

      // on renvoie la promise
      return deferred.promise;
    }
  }
});

myApp.controller('MyCtrl', function ($scope, myService) {
  // on recupere la promise que la methode va etre resolue
  var promise = myService.doLoop();

  promise.then(function (arr) {
    // on obtient le resultat de .resolve() ici
    // attention arr n'est accessible seulement dans la closure

    $scope.items = arr;
  });

  // on peut aussi avoir le resultat du rejet
  // promise.reject(function(err) { })
});

moi le truc que je comprend pas, c'est pourquoi / comment / quel est l'âge du capitaine ?

Enfin ok, Javascript c'est de l'asynchrone lorsque tu fait des appels serveurs, m'enfin si tu fait

$scope.awesomeFunction = function(){
    $scope.func1();
    $scope.func2();
}

func2 sera executé une fois que func1 aura finit...

Non,

function inner1() {
  console.log('start inner 1');

  setTimeout(function() {
    console.log('stop inner 1');
  }, 2000);
}

function inner2() {
  console.log('start inner 2');

  setTimeout(function() {
    console.log('stop inner 2');
  }, 1000);
}

(function outer() {
  inner1();
  inner2();
})();

Ce code te renverra

start inner 1
start inner 2
stop inner 2
stop inner 1
Reivax
Auteur

prbaron donc logiquement avec les promises c'est jouable ?
Pour être plus clair, j'ai une fonction avec un forEach, qui doit lancer une autre fonction QUAND le forEach est terminé

function myFor() {
    angular.forEach(files, function(file, key) {
        //boucle
    }, files);
    secondFunction();
}

suivant ce que tu fais dans ton forEach, tu peux garder tel quel. Si le code est synchrone dans le forEach, c'est bon.

Reivax
Auteur

Au final j'aurais plusieurs fonctions à enchainer, si les précentes sont terminées.
J'ai regardé du côté des promises avec $q, mais j'ai du mal a capter comment faire :(

Tu aurais des ressources/tutoriaux à ce sujet ?
merci d'avance