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 :

Fonction JS qui renvoie un tableau à utiliser dans une autre fonction ?


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet ERP
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet ERP

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Par défaut Fonction JS qui renvoie un tableau à utiliser dans une autre fonction ?
    Bonjour,
    dans un programme JS j'ai une fonction getGridTitleForMainLang pour charger le contenu d'un fichier xml dans un tableau, grâce à un HTTPRequest. Cette fonction est ensuite appelée dans une autre fonction loadXMLGridFileToTag pour récupérer ce tableau et l'utiliser comme filtre d'autres données reçues d'un autre fichier xml. Le problème est que je n'arrive pas à récupérer ce tableau de données. J'ai aussi essayé avec la récupération d'un objet mais je n'y arrive pas, cela renvoie toujours 'undefined'.

    1) Voici la fonction getGridTitleForMainLang

    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
    var rootFolder ='file:///D:/LANGUAGES/';
    var databaseFolder = 'database/';
    function getGridTitleForMainLang(filename) {
        var xmlHTTP2 = new XMLHttpRequest();
        try {
            xmlHTTP2.open("GET", rootFolder + databaseFolder + filename, true);
            xmlHTTP2.setRequestHeader("Content-Type", "text/xml");
            xmlHTTP2.send(null);
        }
        catch (e) {
            window.alert("Unable to load the file "+filename);
        }
        xmlHTTP2.onreadystatechange = function() {
            if (xmlHTTP2.readyState == 4 && this.status == 200) {
                var xmlDoc2 = xmlHTTP2.responseXML;
                var titles = xmlDoc2.getElementsByTagName(mainLang.toLowerCase())[0].childNodes;    
                var gTitles = [];
                for (var i = 0; i < titles.length; i++) {
                    if (titles[i].nodeType == 1 && titles[i].childNodes[0].nodeType == '3') {
                        if (titles[i].childNodes[0].nodeValue.trim() == "") {
                            gTitles.push("?");
                        }
                        else {
                            gTitles.push(titles[i].childNodes[0].nodeValue);
                        }
                    }
                }
                console.log(gTitles.join(";"));
                return gTitles.join(";");
            }
        }
    }
    2) Et voici la fonction loadXMLGridFileToTag

    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
    function loadXMLGridFileToTag(filename, titletag) {
        var x = getGridTitleForMainLang("article.xml");
        alert(x.toString());
        console.log(x); 
        var xmlHTTP = new XMLHttpRequest();
        try {
            xmlHTTP.open("GET", rootFolder + databaseFolder + filename, true);
            xmlHTTP.setRequestHeader("Content-Type", "text/xml");
            xmlHTTP.send();
        }
        catch (e) {
            window.alert("Unable to load the requested file "+filename);
            return;
        }
        xmlHTTP.onreadystatechange = function() {
            if (xmlHTTP.readyState == 4 && this.status == 200) {
                var xmlDoc = xmlHTTP.responseXML;
                var titles = xmlDoc.getElementsByTagName(mainLang.toLowerCase())[0].childNodes;
                var gTitles = [];
                // use the x data here
                // ............................
            }
        }
    }
    Dans cette seconde fonction, alert(x.toString()) renvoie undefined

    Je me demande s'il est possible d'utiliser deux HTTPRequest en même temps.

    Qui a une solution ? Merci

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 680
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 680
    Par défaut
    vous marqué "x = getGridTitleForMainLang(..." mais la fonction "getGridTitleForMainLang" ne retourne rien donc vous devez revoir la façon dont sont transmise les données

    une requête XHR est asynchrone par défaut donc la réponse de la requête HTTP se fait après le retour de la fonction.
    vous pouvez par exemple lancer le 2e appel XHR à l'endroit où vous avez mis "return gTitles.join(";");" à la réponse du 1er appel.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet ERP
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet ERP

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Par défaut
    Merci pour ces réponses mais je ne suis pas sûr de tout comprendre.
    Pour la fonction getGridTitleForMainLang qui ne renvoie rien, j'ai pourtant bien un return à la fin.
    Pour l'explication sur l'asynchrone je ne comprends pas bien. Est-ce que cela veut dire que je demande le résultat d'une fonction avant qu'il ne soit disponible ?

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 680
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 680
    Par défaut
    Citation Envoyé par lightstring4 Voir le message
    Pour la fonction getGridTitleForMainLang qui ne renvoie rien, j'ai pourtant bien un return à la fin.
    le "return" est à la fin de la fonction anonyme et pas à la fin de la fonction "getGridTitleForMainLang"

    Citation Envoyé par lightstring4 Voir le message
    Pour l'explication sur l'asynchrone je ne comprends pas bien. Est-ce que cela veut dire que je demande le résultat d'une fonction avant qu'il ne soit disponible ?
    oui c'est ça. l'objet XHR lance la requête HTTP et rend la main et donc le code sort de la fonction getGridTitleForMainLang par exemple
    et quelques secondes après, au moment où la réponse de la requête arrive, la fonction anonyme est exécutée dans une autre pile d'exécution

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet ERP
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet ERP

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Par défaut
    J'ai utilisé vos commentaires et j'ai réussi à obtenir ce que je voulais. Effectivement la gestion de l'asynchrone est subtil, il vaut mieux comprendre avant comment ça fonctionne.
    Merci encore.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/05/2015, 17h49
  2. Réponses: 2
    Dernier message: 11/03/2011, 21h17
  3. [Tableaux] Fonction recursive qui renvoie un tableau
    Par lolodev dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2009, 09h47
  4. fonction qui renvoie un un objet d'une autre classe
    Par miloon dans le forum Débuter
    Réponses: 3
    Dernier message: 16/02/2009, 20h45
  5. Réponses: 2
    Dernier message: 29/08/2007, 19h43

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