[AngularJS] Attendre la fin d'une fonction

Par Reivax, il y a 10 ans


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, il y a 10 ans

Personne ? ^^

Maenhyr, il y a 10 ans

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) { }) });
keulu, il y a 10 ans

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...

Maenhyr, il y a 10 ans

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, il y a 10 ans

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(); }
Maenhyr, il y a 10 ans

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, il y a 10 ans

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