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

JavaScript Discussion :

Attendre la fin d'une fonction


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut Attendre la fin d'une fonction
    Bonjour,



    J'espere que vous pourrez aider un newbe

    Je sais que le sujet a déjà été traité plein de fois mais toutes les solutions trouvées pour le moment ne m'ont pas aidées.


    Problème :

    J'utilise 2 fonctions (A et B) l'une à la suite de l'autre et la fonction A comporte une autre fonction (X).

    Le problème est que, même avec un .done(), la fonction B s'exécute avant la fonction X.

    Je n'arrive pas a executer la fonction B après la fin de la fonction A, qui se termine après la fin de la fonction X.


    Code :
    Base :

    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
    $('.btn-add-node').click(function(){
    	console.log('btn add node clicked');
    	var actual_tree = $('#tree').treeview('getNode', 0);
    	// $('#tree').hide();
    	var ref_model = $('#ref_model').text();
    	$(this).parent().parent().children('.modal-body').children('.col-md-8').children('.form-checkbox').children('.controls').children('label').children('input[type=checkbox]').each(function (index, value) {
    		if (this.checked) {
     
    			actual_tree = $(this).addNode($(this).getNode(), ref_model, actual_tree); // => Fonction A
    		} else {
    	    	actual_tree = $(this).removeNode(value, ref_model, actual_tree);
    		}
    	});
    	$(this).createTree([actual_tree]); // => fonction B
    	// $('#tree').show();
    	$('#modal_add_nodes').modal('hide');
    });

    Fonction A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*
    	* Add a node in the treeView
    	*/
    	$.fn.addNode = function(data, reference, actual_tree) {
    		console.log('add node');
    		console.log(data);
    		console.log('add ' + data.records.text + ' in ' + reference);
    		actual_tree = insertSubNode(data.records, reference, actual_tree);
    		return actual_tree;
    	};
    Fonction X :

    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
    22
    23
    24
    25
    26
    function insertSubNode(data, reference, node) {
    	console.log('insert sub node');
    	if (node.nodeId == reference) {
    		var need_add = true;
    		$.each(node.nodes, function(index, value) {
    			if (data.text == value.text) {
    				need_add = false;
    			}
    		});
    		if (need_add) {
    			node.nodes.splice(0, 0, data);
    		}
    	} else if (node.hasOwnProperty('nodes')) {
    		var new_nodes = [];
    		$.each(node.nodes, function(index, value) {
    			if (value.hasOwnProperty('nodes')) {
    				new_nodes.push(insertSubNode(data, reference, value));
    			} else {
    				new_nodes.push(value);
    			}
    		});
    		node['nodes'] = new_nodes;
    	}
     
    	return node;
    };

  2. #2
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $(this).parent().parent().children('.modal-body').children('.col-md-8').children('.form-checkbox').children('.controls').children('label').children('input[type=checkbox]').each(function (index, value) {
              if (this.checked) {
                      actual_tree = $(this).addNode($(this).getNode(), ref_model, actual_tree, function(){
                            $(this).createTree([actual_tree]); // => fonction B
                      ); // => Fonction A
    	  } else {
    	          actual_tree = $(this).removeNode(value, ref_model, actual_tree, function(){
                            $(this).createTree([actual_tree]); // => fonction B
                      );
    	  }
    	});
    Cela fonctionne-t-il ? Pour moi attendre qu'une fonction se termine se fait par l'appel au Callback d'une fonction (en rajoutant 'function(){ /* Les choses à faire */}' à la fin d'une fonction comme j'ai marqué au dessus)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Merci de ta réponse,

    Je me suis servi de ta methode pour modifier mon code, cependant, ma dernière fonction ($(this).createTree([actual_tree])) n'est pas appelée.

    Voici le code modifié :
    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
    $('.btn-add-node').click(function(){
    	console.log('btn add node clicked');
    	var actual_tree = $('#tree').treeview('getNode', 0);
    	$('#tree').hide();
    	var ref_model = $('#ref_model').text();
    	$(this).parent().parent().children('.modal-body').children('.col-md-8').children('.form-checkbox').children('.controls').children('label').children('input[type=checkbox]').each(function (index, value) {
    		if (this.checked) {
    			$.getJSON("/exports/data/" + $(this).val(), function(data) {
    		        $(this).addNode(data, ref_model, actual_tree, function(){
                            $(this).createTree([actual_tree]); // => fonction B
                      });
    		    });
    		} else {
    	    	actual_tree = $(this).removeNode(value, ref_model, actual_tree);
    		}
    	});
    	$('#tree').show();
    	$('#modal_add_nodes').modal('hide');
    });

  4. #4
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 11
    Par défaut
    Tu dis que ta dernière fonction ($(this).createTree([actual_tree])) n'est pas appelée, tu parles de celle du if ? Parce que si oui je ne vois pas trop pourquoi.

    Par contre quelque chose me perturbe dans ton code modifié, sur ton premier message, ta fonction ($(this).createTree([actual_tree])) s'applique au if ET au else (si je dis pas de bêtises ?) or dans ton code modifié tu n'appliques ta fonction ($(this).createTree([actual_tree])) que à ton if. Normal ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Effectivement, j'ai oublié de préciser que je ne parlai que de la fonction "if", plus particulièrement de cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $.getJSON("/exports/data/" + $(this).val(), function(data) {
        $(this).addNode(data, ref_model, actual_tree, function(actual_tree){
            $(this).createTree([actual_tree]); // => fonction B
        });
    });
    Dans cette partie, le "$(this).createTree([actual_tree]);" n'est pas appelé. (console.log a l'appuie).

    Je n'ai pas encore touché à la partie "else" qui ne s'applique que si le "if" est appelé une première fois.

    Je ne vois pas non plus pourquoi puisque la fonction "$(this).addNode()" est bien appelée.

  6. #6
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 11
    Par défaut
    Essaye d'utiliser des alert(); afin de savoir si tu passes par tel ou tel endroit, ça aide beaucoup pour débugger un script.

    J'ai un autre questionnement concernant ton paramètre actual_tree que tu passes à ta fonction B entre crochets. Pourquoi justement entre crochets alors que tu l'utilises sans crochet le reste du temps ?

Discussions similaires

  1. Attendre la fin d'une fonction asynchrone
    Par JustyDark dans le forum NodeJS
    Réponses: 6
    Dernier message: 18/05/2015, 23h11
  2. attendre la fin d'une fonction
    Par stoner2008 dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 19/04/2012, 15h32
  3. Attendre la fin d'une fonction avant d'en executer une autre
    Par FluidBlow dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 24/07/2009, 21h46
  4. [PHP 5.0] Attendre la fin d'une fonction pour en realiser une autre
    Par keaton7 dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2009, 16h06
  5. Attendre la fin d'une fonction
    Par benjhe dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/12/2007, 14h44

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