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

Bibliothèques & Frameworks Discussion :

Ajax : 1 nouvelle requete en annule une autre [MooTools]


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut Ajax : 1 nouvelle requete en annule une autre
    Bonjour à toutes et tous !

    Voilà je bloque sur un problème assez basique auquel je ne trouve pas de solution concrète...

    Je suis en train de faire un champ de recherche dynamique. J’interroge donc ma base de donnée avec Ajax à chaque fois que la valeur du champ est modifié.

    J’aimerais qu'à chaque fois qu'une nouvelle lettre est tapée la nouvelle requête annule la requête en cours.

    J'ai déjà essayer de passer le paramètre "async" en false pour passer en mode synchrone mais mes requêtes continus à s'enchainer...

    Voici le code de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var myRequest = new Request({
    		    url: 'index.php',
    		    method: 'get',
    		    async: 'false',
    		    onSuccess: function(responseText){
    				alert(responseText);		
    		    },
    		    onFailure: function(){
    		        myElement.set('text', 'Sorry, your request failed :(');
    		    }
    		});
    		myRequest.send('type=' + type + '&task=contentSearch&value=' + value);

    Merci d'avance pour vos idée et bon week end !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Tu as passé la chaîne 'false' et non le booléen false, et la chaîne 'false' vaut... true

    Cela dit, je ne recommande pas de passer en synchrone car à chaque fois que tu taperas une lettre ça va figer l'interface le temps que le serveur réponde.

    Pour moi le plus simple ça serait de "remonter" l'objet request dans un scope plus global et de le tester dans ton évènement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var myRequest = new Request (...);
    myElement.addEvent('mouseup', function() {
        if (myRequest.isRunning()) {
            myRequest.cancel();
        }
        myRequest.send(...);
    });
    Et pour faire encore mieux ? Tu ne fais qu'une seule requête pour la première lettre et tu affines le tri sur tes résultats à chaque lettre suivante sans refaire appel au serveur, ça sera beaucoup plus performant...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Bonjour luca et merci pour la réponse,

    Effectivement la fait d'utiliser (correctement ) l'option "async" ne résoud pas du tout mon problème...

    Je pense être sur la bonne voie avec la méthode "isRuning()"...
    Par contre moi ce que j'aimerais faire c'est :
    - savoir si une requête est déjà en cours;
    - si OUI : l'annuler pour en refaire une autre;

    En regardant ton code j'ai vu des différence avec le miens... c'est pour cette raison que j'ai du mal a adapter ta solution, comment faire pour l'adapter à mon code (que je remet ci-dessous) ??

    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
     
    function fonctionDeclencheeParEvenementKeyup()
    {
            var running_request = //Comment détecter une requête en cours vis à vis de mon context ??...
            if(running_request)
            {
                  //...et comment l’annuler avant d'en faire une autre ??
            }
                   var myRequest = new Request({
    		    url: 'index.php',
    		    method: 'get',
    		    async: 'false',
    		    onSuccess: function(responseText){
    				alert(responseText);		
    		    },
    		    onFailure: function(){
    		        myElement.set('text', 'Sorry, your request failed :(');
    		    }
    		});
    		myRequest.send('type=' + type + '&task=contentSearch&value=' + value);
    }
    Je trouve pas mal ton idée de faire qu'une seul requête mais il y a 2 inconvénients :
    - rapport à mon contexte, je risque d'avoir des problèmes d'affichage quand il y aura beaucoup de résultats;
    - je suis là aussi obliger d'annuler toute nouvelle requête;

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pour traiter avec la requête en cours il faut que ton objet Request ait une portée plus globale que celle de ta fonction. Si tu n'es pas à l'aise avec la question de la portée des variables c'est prioritaire de se documenter là dessus si tu ne veux pas rencontrer de gros soucis dans tes développement Javascript...

    Sur ton 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
     
    var myRequest = new Request({
    		    url: 'index.php',
    		    method: 'get',
    		    async: 'false',
    		    onSuccess: function(responseText){
    				alert(responseText);		
    		    },
    		    onFailure: function(){
    		        myElement.set('text', 'Sorry, your request failed :(');
    		    }
    		});
     
    function fonctionDeclencheeParEvenementKeyup()
    {
            if(myRequest.isRunning())
            {
                  myRequest.cancel();
            }
     
    		myRequest.send('type=' + type + '&task=contentSearch&value=' + value);
    }
    myRequest étant global, c'est le même objet qui est utilisé à chaque appel de ton handler d'évènement, on peut donc tester si elle est en cours et l'annuler avant de la relancer.

    Cela fait un certain temps que je n'ai pas touché à du dév frontend, je ne te garantierais pas que ça soit bullet proof et que ça fonctionne très bien dans 100% des cas, mais je te conseille de creuser dans ce sens.

    Si jamais ça ne marche pas tout le temps et que ça paraît "buggy", regarde du côté de cette classe, qui peut à défaut d'annuler tes Requests faire en sorte qu'elles soient traitées dans le bon ordre, une à la fois : http://mootools.net/docs/more/Request/Request.Queue

  5. #5
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Merci infiniment Nighty,

    Finalement j'ai opté pour ta solution, c'est à dire sortir la requête de ma fonction, et j'ai résolus mon problème !

    Effectivement j'ai tendance à oublier la porté des variables en JS, certainement parce que je jongle beaucoup entre JS et PHP...

    Encore merci et bonne journée !

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

Discussions similaires

  1. [Requete] order_by dans une autre table
    Par cisqo dans le forum Requêtes
    Réponses: 12
    Dernier message: 24/09/2006, 11h40
  2. Réponses: 23
    Dernier message: 19/09/2006, 12h33
  3. Réponses: 3
    Dernier message: 19/06/2006, 11h26
  4. TSQL requetes à partir d'une autre
    Par topolino dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/04/2006, 12h31
  5. Réponses: 3
    Dernier message: 05/01/2006, 16h14

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