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 :

Appel synchrone de callback


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut Appel synchrone de callback
    Bonjour,

    Je suis en train de développer un site web avec une googlemap intégrée ce qui m'oblige malheureusement a me mettre au javascript (API en javascript)...et je ne suis pas forcémnt trés à l'aise avec ce langage.

    Jusqu'a maintenant, je n'avais rencontré aucun problème (enfin presque) mais se pose à moi un problème lié à l'appel de callbacks (apparement exécutés de façon asynchrone)

    En gros, l'application demande à l'utilisateur une adresse de départ, et une adresse d'arrivée. Ensuite, grâce au geocoder fourni par l'API googlemap, je retrouve toutes les possibilitées d'adresses correspondantes à ce qu'il a entré.

    Cela se fait de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ok=true;
    geocoder.getLocations(addressDep, function(response) {getPos(response,document.getElementById("choosedep"))});
    geocoder.getLocations(addressArr, function(response) {getPos(response,document.getElementById("choosearr"))});
    if (ok)
    {
    alert("c'est tout bon");
    }
    getLocations() : méthode de l'objet geocoder (GClientGeocoder) qui prend en paramètre une adresse (string) et une fonction de callback
    addressDep et addressArr : les adresses de départ et d'arrivée issues des input
    getPos() : fonction qui est appelée dans le callback et qui modifie la variable ok en fonction de plusieurs paramètre que je ne vais pas exposer ici
    ok : variable booléenne modifiée dans getPos et qui teste si l'adresse entrée existe et si il n'y a qu'une adresse réelle correspondante (pour chaque input)

    Mon problème : le test effectué à l'issu des deux appels n'est pas pertinent car la variable ok n'est pas encore modifiée (execution du callback dans un thread parallèle)

    Ma question : est-il possible de rendre l'execution du callback synchrone ???

    merci

    Lantier!

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    demande le statut de ok à la fin de getLocations() et non après les 2 appels de fonctions; si ok passe à true, ce sera le signe que le traitement est terminé et que le test a forcément eu lieu;

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    huh ?
    le problème c'est que getLocations ce n'est pas une de mes fonctions mais une méthode fournie par l'API googlemap...donc je peux pas faire mon test dedans...

    et j'ai pas bien compris comment ca règlerai le problème ??
    si ce que tu voulais dire c'était de faire le test à la fin du getPos(), ca ne marche pas puisque ce que je veux c'est qu'a l'issu des deux appels, ok soit a true (ce qui signifierai que les 2 adresses sont correcte et identifiables) et la, la variable est modifiée mais seulement après (puisque c'est fait en parallèle)

    en fait la pluspart du temps, ok passera a false et il faudra refaire une recherche jusqu'a ce qu'elle ne soit plus modifiée.

    n'y a-t-il pas un moyen d'attendre que la variable soit modifiée avant de faire le test ??

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    es-tu obligé d'initialiser ok à true, avant le traitement des données?

    du coup, tu fais ton test dans un setInterval;

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    ben nan, je ne suis pas obligé, je peux aussi bien l'initialiser a null ou encore ne pas l'initialiser du tout et l'affecter directement dans mon getPos().

    par contre, kesako setInterval pour les tests ??

    sinon, il me reste encore la solution de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ok = null
    //appels aux fonctions
    while(ok == null);
    if (ok)
      alert("c'est tout bon !")
    mais la du coup, quand la première aura changé la valeur, ca attendra pas la deuxième...

    alors peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    oktmp = null;
    //appel a la première fonction
    while(oktmp == null);
    var ok=oktmp;
    oktmp = null;
    //appel a la deuxième fonction
    while(oktmp == null);
    ok &= oktmp;
    if (ok)
      alert("c'est tout bon !");
    ca devrait fonctionner nan ?
    Qu'en pensez-vous ?

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    c'est une manière simple de lancer une instruction à intervalle défini, jusqu'à ce qu'une condition soit remplie (sans la paralysie provoquée par while);

    dans ton cas, ça va laisser le temps au traitement de s'accomplir, avant que le test "ok" se réalise;

    bref, c'est pour ça que je te déconseillais de mettre ok à true au début: vu que le test est effectué avant la fin des traitements, tu obtiens forcément une réponse positive!;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setInterval("if(ok){alert('ok')}",1)

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    a priori, les traitements se suivent... mais javascript a un fonctionnement si imprévisible...
    d'où l'idée que j'avais eue d'un appel récursif de getPos(), ce qui signifierait un seul appel de getLocations(); à mon avis, ça résout le problème; mais je ne sais pas si tu peux te le permettre?

  8. #8
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Citation Envoyé par javatwister Voir le message
    a priori, les traitements se suivent... mais javascript a un fonctionnement si imprévisible...
    ca tu l'as dit !

    d'où l'idée que j'avais eue d'un appel récursif de getPos(), ce qui signifierait un seul appel de getLocations(); à mon avis, ça résout le problème; mais je ne sais pas si tu peux te le permettre?
    bah en fait ca parait pas possible, parceque getLocations() prend en paramètre une adresse, et ca n'est pas la même dans les deux cas...sinon, faudrait que je modifie le tout et que le deuxième appel à getLocation() se fasse dans le premier getPos() et donc que je fasse deux fonctions différentes...un getPosDep() et un getPosArr(), ce qui est un peu lourd mais bon...

    je vais tester ta solution et pis si ca fonctionne pas, je changeai tout...tant pis !

    je te tiens au jus !

  9. #9
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    j'ai essayé ta technique,ca se passe bien dans la majorité des cas...

    mais quelques fois ca passe dans l'"alerte victorieuse" alors qu'il ne faudrait pas !

    on dirait bien que les 2 callbacks s'exécutent en parallèle...

    chier !

  10. #10
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    et avec une 3e variable, incrémentée?


    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
    27
    28
    29
    var begin, end;
     
    var passage=0;
     
     
    function getPos(response){
     
    	if(toutbaigne){
    		passage++;
     
    		if(!begin){// si "départ" n'est pas encore évalué
    			begin=true
    		}
    		else{// si "départ" a déjà été évalué
    			end=true
    		};
     
    		if(passage==2){
            		alert("données acceptées"); action lancée;
    		}
    	}
    	else{
    		passage=0;
    		begin=false; 
    		end=false;
    		alert("données refusées")
    	}
     
    }

  11. #11
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Ouaip,

    ca a l'air de marcher, mais je n'ai pas testé tous lescas et je pense que le problème reste entier (enfin je crois) ! Mais ca ira bien pour l'instant !

    je te remercie bien d'avoir pris du temps pour m'aider !

    je te libère !

    ciao!

Discussions similaires

  1. Remote Procedure Call - Appel Synchrone
    Par gufra dans le forum GWT et Vaadin
    Réponses: 16
    Dernier message: 07/08/2008, 17h23
  2. Appel d'une callback depuis un autre module
    Par Bayard dans le forum Général Python
    Réponses: 6
    Dernier message: 08/06/2008, 17h47
  3. AQ 10G-Exception généré par un PL appelé via un callback
    Par The Machin X dans le forum Administration
    Réponses: 0
    Dernier message: 14/05/2008, 15h11
  4. Réponses: 5
    Dernier message: 06/04/2008, 13h09
  5. Appel d'un callback sur un event un peu particulier
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/06/2007, 16h40

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