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

jQuery Discussion :

Utilisation d'AJAX en mode synchrone [AJAX]


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 16
    Par défaut Utilisation d'AJAX en mode synchrone
    Bonjour,

    je souhaite réaliser une fonction (en javascript orienté objet) simple qui créée un élement en base de données (via AJAX) et qui récupère l'id créée par MySQL pour l'affecter à l'objet.
    voici mon code:

    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
     
     
    function lobby(){
    this.id='549';
     
    this.create=function()
    {
     $.ajax({
           url : 'requete_ajax.php',
           type : 'GET',
           data : { action: 'newLobby'} ,
           async:false,
           dataType :'text',
           success : this.setId
    });
     
    }
     
    this.setId=function()
    {
    this.id=arguments[0];
    console.log('setId: '+this.id);
    }
     
    }
    la page requete_AJAX.php créé un nouvel enreg dans la base et retourne l'id créé par MySQL (que je récupère avec arguments[0])
    Cette partie là fonctionne.


    Quand j'utilise la fonction (ou plûtot l'objet) dans mon code javascript:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    lobby=new lobby(); // creation de l'objet
    lobby.create();  // creation du lobby en bdd et affectation de l'id
    console.log('lobbyId: '+lobby.id);
    Ce que m'affiche la console :
    setId: 40 (l'id créé en base de données) => OK
    lobbyId: 549 (l'id par défaut de l'objet lobby)

    => alors qu'entre temps la fonction setId aurait du affecter la valeur '40' à 'id' et non conserver la valeur par défaut '549'.


    Je pense que la fonction console.log('lobbyId: '+lobby.id) est exécutée avant que l'AJAX n'est retourné le nouvel id et est lancé la fonction setId().
    Je pensais qu'en mettant le paramètre async:false, le navigateur attendait la réponse ajax avant d'exécuter la suite du code js?

    Quelle est mon erreur ? quelle serait la solution ?

    Merci pour vos conseils.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ce n'est pas une question d'ordre d'appel des fonctions puisque comme tu le dis, une requête asynchrone attend d'avoir reçu la réponse avant de rendre la main (ce qui fait que ce mode est déconseillé du reste...).
    Ton problème vient surtout de la valeur de this dans les différentes parties de ton code. Et malheureusement pour toi, dans la fonction AJAX, this n'est plus le même !

    En JavaScript, this se réfère toujours à l'objet ayant appelé la méthode en cours, donc quand tu écris
    l'objet appelant la méthode ajax(), c'est $, pas l'instance de ton objet.
    Une solution courante dans ce genre de cas est d'utiliser une variable intermédiaire pour garder une référence à l'instance en cours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    this.create=function(){
      var that = this;
     $.ajax({
           url : 'requete_ajax.php',
           type : 'GET',
           data : { action: 'newLobby'} ,
           async:false,
           dataType :'text',
           success : that.setId
    });
    }
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 16
    Par défaut
    Merci!!
    Problème résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/04/2013, 11h54
  2. [AJAX] FireFox ne veut pas du mode synchrone AJAX
    Par mickael28 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/02/2009, 10h33
  3. [AJAX] Pb de listes liées en mode Synchrone sous FireFox
    Par olive_le_malin dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/12/2006, 17h28
  4. [AJAX] Ajax en mode synchrone sur Safari
    Par The Blec dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 17h52

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