JeuWeb - Crée ton jeu par navigateur
Javascript va trop vite pour récup les données AJAX - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Javascript va trop vite pour récup les données AJAX (/showthread.php?tid=7763)

Pages : 1 2 3


RE: Javascript va trop vite pour récup les données AJAX - L'Omniscient - 08-02-2017

Je peux pas tout vous donner, ya 800 lignes, c'est indigérable >.<

Mais je vais vous donner deux fonctions complètes pour vous montrer un peu l’imbriquement des fonctions

Code :
/* II. Affichage de l'exploration*/
function exploration_go() {
    document.getElementById('mentor_disp').style.display = "none";
    $('#base, #explo1, #explo2, #explo3, #zone_zoom').css('visibility','visible');
    if (document.getElementById('zone_zoom').style.display == "block") {
        quitter_reg();
    }
    $('#Nord, #Sud, #Est, #Ouest').css('visibility', 'visible');
    /* Génération du nombre de points d'exploration */
    points_exploration = 4;
    document.getElementById('exploration_terminee').style.display = "none";            
    /* Génération de la position aléatoire */
    y = Math.round(Math.random() * (3 - 0) + 0);
    x = Math.round(Math.random() * (3 - 0) + 0);
    reg = y+''+x;
    /* Appel de la fonction qui modifie les informations selon la position */
    explorer_region();
    $('#cadre_exploration_tout').css("display", "block");
    /* Supprime l'inventaire et la carte */
    $('#base').animate({
        opacity: 0,
    }, 1250)
    document.getElementById('titres').style.opacity = "0";
    document.getElementById('ressources').style.opacity = "0";
    document.getElementById('ressourcesA').style.opacity = "0";
    document.getElementById('type').style.opacity = "0";
    document.getElementById('typeA').style.opacity = "0";
    setTimeout(function(){
        $('#base').css("display", "none");
        $('#cadre_exploration_tout').animate({
            opacity: 1,
        }, 1250);
    }, 1250);        
    /* Appel de la fonction qui fait apparaître les éléments naturels */
    apparition_element();
    /* Appel de la fonction permettant d'ajuster les dimensions de la page en cas de plein écran */
    ajuste_taille();
    /* Appel de la fonction qui génère l'animation */
    setTimeout(function(){
        animation_elements();
    }, 1200);    
    classement_top_moins();
    regles_top_moins();
}

    function explorer_region(){
        infos_baguette();
        nom_regions();
        /* Affiche les différents cadres d'exploration */
        document.getElementById('ressourcesA').style.display = "block";
        document.getElementById('ressources').style.display = "block";
        document.getElementById('type').style.display = "block";
        document.getElementById('typeA').style.display = "block";
        document.getElementById('recuperation').style.display = "none";    
        effacement_pointCardinaux();
    }

function infos_baguette() {
        if (faction == "Fée") {
            search = "search";
            $.ajax({
                url : 'AJAX.php',
                type : 'POST',
                data : 'infos_baguette='+search,
                dataType : 'text',
                error : function(){
                    disconnect();
                },
                success : function(info_baguettes) {
                    decrypt_baguette_active = JSON.parse(info_baguettes);
                    baguette_active = decrypt_baguette_active['nom'];
                },
            });    
        }

function apparition_element() {
                nature_absorbe();
            }

function nature_absorbe() {
        if (faction == "Fée" && baguette_active == "Jaunoyante") {
            document.getElementById('type').src = "http://www.ile-du-coeur.com/icojau.gif";
        } else if (faction == "Fée" && baguette_active == "Amusette") {
            document.getElementById('type').src = "http://www.ile-du-coeur.com/icoamu.gif";
        } else if (faction == "Fée" && baguette_active == "Sanguine") {
            document.getElementById('type').src = "http://www.ile-du-coeur.com/icosan.gif";
        } else if (faction == "Fée" && baguette_active == "Harmonieuse") {
            document.getElementById('type').src = "http://www.ile-du-coeur.com/icohar.gif";
        } else if (faction == "Fée" && baguette_active == "Âme-de-vie") {
            document.getElementById('type').src = "http://www.ile-du-coeur.com/icoame.gif";
        } else {
            document.getElementById('type').src = "http://www.ile-du-coeur.com/icone_essence.gif";
        }
        document.getElementById('type').onclick = " ";
        document.getElementById('type').style.display = "block";
        document.getElementById('type').title = "Absorber l'essence (R)";
        document.getElementById('type').onclick = function() {action();};
    }



RE: Javascript va trop vite pour récup les données AJAX - L'Omniscient - 08-02-2017

Xenos, ce que je ne comprends pas bien, c'est que si le code ne passe pas par infos_baguette (si le joueur n'est pas une fée), à quelle moment il est dit que action_exploration doit être lancé ? Faut que je fasse un else pour les joueurs non fées avec l'appel de action_exploration ? (et donc tous les joueurs passent par une fonction première du genre "choix_perso" qui va dans quelle fonction ?)

(Et pourquoi le JSON avant l'insertion de SESSION en JS ? Jusque là j'ai pas eu de soucis avec ça :o )

EDIT : bon, ça me paraît complètement impossible, j'ai l'impression qu'il faut que je fasse un truc du genre :
function a() {
infos_baguette(recup_donnees) {function b(recup_donnees)};
}

function b (recupA) {
function c (recupA);
}

function c (recupB) {
function d (recupB) {
}

Mais encore plus compliqué que ça parce qu'après j'ajoute des éléments onclick = function d (recup_donnees).

C'est... Juste impossible ?


RE: Javascript va trop vite pour récup les données AJAX - Xenos - 08-02-2017

Mais si, c'est possible, il faut juste que t'arrive à lâcher la pensée PHP (où les étapes se déroulent l'une après l'autre) pour saisir le principe asynchrone/évènementiel.

Lis bien: action_exploration est toujours appelé, soit dans le success de l'AJAX, soit dans le cas où on n'entre pas dans le "if".

Quand tu lis un JS, essaie de ne pas le lire comme un PHP en déroulant ligne à ligne. Déroule-le évènement par évènement. Si tu lis la fonction d'exploration, tu verras que soit tu fais un appel AJAX et à son succès il se passera un truc (qui est un appel à action_exploration), soit tu fais directement un appel à action_exploration. Tu ne sais donc pas "quand" sera appelé cette fonction, mais elle le sera.


RE: Javascript va trop vite pour récup les données AJAX - niahoo - 08-02-2017

Moi je vois un gros problème dans ton code. Tu appelles infos_baguette pour alimenter des variables globales. Tu appelles cette fonction et ensuite tu comptes sur ces variables.

Le problème commence là. C'est une très mauvaise pratique. C'est effectivement très mal fagotté. Et pourtant tu utilises déjà l'asynchrone :

setTimeout(function(){
       animation_elements();
   }, 1200);

setTimeout est une fonction asynchrone qui prend une callback. D'ailleurs, comme tu n'as pas d'arguments, tu devrais l'utiliser comme ceci :
setTimeout(animation_elements, 1200);