IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AngularJS Discussion :

callback / promise


Sujet :

AngularJS

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 40
    Par défaut callback / promise
    Bonjour,

    j'essai de comprendre comment fonctionne le .then() d'angular, dans certain cas j'arrive bien a le faire fonctionné et dans d'autre je me retrouve avec l'erreur : "TypeError: Cannot read property 'then' of undefined"

    je pense que j'ai un soucis de compréhension des callback et promise..

    voici une de mes fonctions qui foire:
    controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'use strict';
    var app = angular.module('appli');
    app.controller('MsgCtrl', function ($firebaseArray,$firebaseObject,$firebase,$scope,Messages,Auth,toaster) {
        $scope.idUtil = Auth.user.uid;
    	$scope.listemsg = Messages.getMsg($scope.idUtil);
    	console.log($scope.listemsg);
    	$scope.valider = function(id){
    		Messages.validerMsg(id,$scope.idUtil).then(function(){
    			alert('coucou');
    		});
    	};
    });
    service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     'use strict';
     var app = angular.module('appli');
     app.factory('Messages', function (FIREBASE_URL,$firebaseArray,$firebaseObject, Auth,$q, toaster,$location) {
     	 var bdd = new Firebase(FIREBASE_URL);
     	 /*recupere toute les infos present dans profile*/
     	 var messages = $firebaseArray(bdd.child('message'));
     	 var Messages =  { 
     		 all: messages,
                     validerMsg: function(id,uti){
    						    var msg = bdd.child('message').child(uti).child('evenement').child(id);
     						var onComplete = function(error) {
    						  if (error) {
    						      	 toaster.pop('error', error);
    						      	 console.log('Error:', error); 
    						  } else {
     					 		toaster.pop('success', "Bravo, événement valider");
     					 		 $location.path('/message');
    						  }
    						};
     						return msg.remove(onComplete); 
     				}
    Donc j'essai tout simplement pour l'instant d'avoir mon alert qui s'affiche, ensuite je passerai une autre fonction a la place de l'alert.
    Pourquoi ai je donc l'erreur Type error, then of undefined ?

    Merci

  2. #2
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Salut,

    Peut-être que dans la méthode tu devrais faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return msg.remove(onComplete).then(function(res){
             return res.data;
    })
    D'ailleurs, tu devrais utiliser des promises partout. c'est conseillé... car les actions associées sont toujours exécutées en asynchrone.
    Ce n'est pas le cas de cet appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Messages.getMsg($scope.idUtil);

    Le fonctionnement des promesses dans AngularJS est relativement le même que n'importe quelle autre API. Exemple : JQuery
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 40
    Par défaut
    En faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return msg.remove(onComplete).then(function(res){
             return res.data;
    })
    J'ai le même soucis TypeError: Cannot read property 'then' of undefined.

    Concernant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$scope.listemsg = Messages.getMsg($scope.idUtil);
    Sa serait mieux de faire une promise que de stoker le résultat dans mon scope a l'appel du controller ? Quel est la différence concrète lors de l’exécution du code ?

  4. #4
    Membre émérite Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Par défaut
    Citation Envoyé par rioll Voir le message
    En faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return msg.remove(onComplete).then(function(res){
             return res.data;
    })
    J'ai le même soucis TypeError: Cannot read property 'then' of undefined.
    Oups, pardon, je pensais que msg était un service et que remove renvoyait une promesse.
    le remove est fait sur le résultat des fonctions child de la variable bdd. Il faudrait voir pourquoi ces fonctions renvoient undefined.
    Je pense que cela n'a rien avoir avec les promises...

    en faisant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $scope.listemsg = Messages.getMsg($scope.idUtil);
    au chargement de la page, ta variable sera toujours nulle car la promesse n'est pas résolue.
    Si tu veux que ta variable soit résolue avant le chargement de ta page, injecte cette variable dans le contrôleur depuis le routeur.
    Sinon, utilise une promesse et affecte son résultat à ta variable.

    Avec le code actuel, à l'exécution, tu as bien ta liste de messages ?

    Concernant les promesses, je te renvoie à la documentation...
    et un article très intéressant sur le sujet : ici
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 40
    Par défaut
    Déjà pour le remove j'ai remplacer par $remove : https://www.firebase.com/docs/web/li...eobject-remove


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    validerMsg: function (id, uti) {
      var msg = bdd.child('message').child(uti).child('evenement').child(id);
      var m = $firebaseObject(msg);
      return m.$remove().then(function (msg) {
        toaster.pop('success', 'Bravo, événement valider');
        $location.path('/message');
      }, function (error) {
        toaster.pop('error', error);
        console.log('Error:', error);
      });
    }
    Voilà qui marche a présent, je renvoi bien une promise a mon controller et donc je peux executer un then:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $scope.valider = function(id){
        Messages.validerMsg(id,$scope.idUtil).then(function(){
            ajoutPresta(id,$scope.idUtil);
        });
    };
    Et oui c'est bien ce que je ne comprend pas, j'ai la liste des messages au chargement de ma page, sans soucis...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    getMsg: function (uti) { //get que les message avec status 0, faire boucle ppour verif et add to liste
     					     	var liste = [];
     					        var msg = $firebaseArray(bdd.child('message').child(uti).child('evenement'));
    	     					    msg.$loaded().then(function(array) {
     
    						            for (var i = array.length - 1; i >= 0; i--) {
     
    							             var resultat  = array[i];
     
    							             if(resultat.status == '0'){
    									          liste[liste.length] = resultat;	
    	 					     			}
    	 					 			}
    		 					 });
     
    				  			return liste;
     
     						 }
    Je pense que le secret cest le $loaded..sa permet de faire de la magie

    Mais malgré ce loaded, est ce que mon code n'est tout de même pas bon?


    Merci en tout cas

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  3. Callback
    Par el_diablos dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2004, 08h48
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo