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

AJAX Discussion :

[AJAX] Callback d'une fonction stockée dans un object


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Par défaut [AJAX] Callback d'une fonction stockée dans un object
    Bonjour,

    J'essaye de faire une fonction qui appelle des requêtes XMLHttpRequest séquentiellement en file (FIFO), avec des callback une fois la requête terminée, voila 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    var queue = [];
    var xmlHttpCurrentlyOccuped = false;
     
    function doWebRequest(method, url, params, callback) {
        var parametres = new Object();
        parametres.myMethod = method;
        parametres.myUrl = url;
        parametres.myParams = params;
        parametres.myCallback = callback;
        queue.push(parametres);
        while (queue.length>0 && !xmlHttpCurrentlyOccuped){
            var doc = new XMLHttpRequest();
            doc.onreadystatechange = function() {
                        var status;
                        if (doc.readyState == XMLHttpRequest.LOADING || doc.readyState == XMLHttpRequest.OPENED){
                            xmlHttpCurrentlyOccuped = true;
                        }
     
                        if (doc.readyState == XMLHttpRequest.DONE && doc.status == 200) {
                            xmlHttpCurrentlyOccuped = false;
                            var data;
                            var contentType = doc.getResponseHeader("Content-Type");
                            data = doc.responseText;
                            queue[0].myCallback(data);
                            queue.shift();
                        }
     
                        else if (doc.readyState == XMLHttpRequest.DONE) {
                            xmlHttpCurrentlyOccuped = false;
                            status = doc.status;
                            if(status!=200) {
                                fonctionPourAnalyserLErreur(url);
                            }
                            queue.shift();
                        }
                    }
            doc.open(queue[0].myMethod, queue[0].myUrl);
            doc.send();
        }
    }
    Mon problème c'est une fois la requête s'est bien déroulée la fonction callback ne marche pas (ligne 24).

    Quelqu'un peut m'aider par un solution?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    J'ai pas regardé en détail ton code mais dans 99.99999% des cas c'est un pb de scope. en clair tu essais d'appeler une méthode d'un objet qui n'existe pas lorsque tu l'appelle.

    là on ne sais pas d'où sort ta callback donc pas simple de te répondre.
    tu as quelque par un objet obj qui à une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    obj ={
       member: 12,
       test: function (data) {console.log(member + " " + data);}
    }
    le principe est le suivant
    tu crée l'objet XHR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doc = new XMLHttpRequest(); //attention cette façon de faire ne marche pas sous IE
    tu associe à ce XHR l'objet qui devra être utiliser lors de la réponsepuis tu défini les traitement de la réponse. attention j'ai vu que tu utilise doc alors qu'il faut utiliser this
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            doc.onreadystatechange = function() {
                        var status;
                        if (this.readyState == XMLHttpRequest.LOADING || this.readyState == XMLHttpRequest.OPENED){
                            xmlHttpCurrentlyOccuped = true;
                        }
     
                        if (this.readyState == XMLHttpRequest.DONE && this.status == 200) {
                            xmlHttpCurrentlyOccuped = false;
                            var data;
                            var contentType = this.getResponseHeader("Content-Type");
                            data = this.responseText;
                            this.scope.test(data); //ici on accès à l'objet associé à ce XHR this.scope
                        }
    JS est un langage à objet il faut l'utiliser comme tel.

    Je n'ai pas compris pourquoi tu avais une queue ni xmlHttpCurrentlyOccuped
    les instance XHR étant indépendantes tu peux leur attacher un membre param
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        doc.params = {
        myMethod : method,
        myUrl : url
    }
    A+JYT

  3. #3
    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
    Juste un détail sekaijin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doc = new XMLHttpRequest(); //attention cette façon de faire ne marche pas sous IE
    Heu... si, ça fonctionne très bien avec IE du moment qu'on utilise au moins la version 7, soit 99.9% des utilisateurs d'IE.
    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

  4. #4
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    oui ma remarque était juste de faire attention
    Ie6 c'est encore au niveau mondial 4.9% des usages

    en 2011 Microsoft avait ouvert un site http://www.ie6countdown.com/ qui donnait les tats pour IE6 et encourageait à migrer vers IE7.
    depuis ce site redirige vers http://www.modern.ie/en-us/ie6countdown
    je ne peux que conseiller à ceux qui encore des site fait pour IE6 de consulter Update your site to web standards.

    A+JYT

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/03/2009, 13h36
  2. [AJAX] [XAJAX] Lancer une fonction JS dans une fonction AJAX
    Par sixieme-sens dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/12/2008, 15h26
  3. Réponses: 1
    Dernier message: 16/10/2008, 11h40
  4. Réponses: 1
    Dernier message: 28/09/2008, 09h14
  5. [AJAX] Appel d'une fonction javascript dans une page chargée en ajax
    Par baedal dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 17/04/2008, 17h03

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