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 - 07-02-2017

Du coup, si je comprends bien, l'asynchrone c'est plusieurs codes qui s'exécutent en même temps ? En fait je crois que j'en ai fais en JS, sauf qu'à la place de callbacks, j'utilisent des variables qui changent de contenu poir bloquer ou non les autres codes qui doivent s'exécuter en parallèle (du genre bloquer une touche pour qu'elle ne puisse pas s'executer une deuxieme fois avant la fin du code précédent). En gros en appuyant sur X, si la variable open est in, le code s'exécute, la variable open in devient open out, du coup sinon reclique ca marche pas, et open out redevient open in en fin de code. (mais je crois pas que je puisse faire l'equivalent en échange AJAX/JS)

niahoo, j'ai essayé dans le success, marche pas parce que l'AJAX est success dès que la page répond et pqs une fois avoir activé le code à l'intérieur (er je suis l'Omniscient de LIle du coeur, pas du monde :p)


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

Oui, tu dois mettre TOUT le code qui dépend du résultat de ta requete ajax dans success !


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

mais le problème c'est que la resolution de l'utilisation des données AJAX ne peut pas s'effectuer dans le success pour dzs questions de structure de code (c'est une possibilité qui impacte le resultat final). J'essaierai les callback ^^ ce soir surement, j'espere que je vais pas mettre une heure à piger comment ça fonctionne xD


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

Alors, c'est que ta structure est mal fagottée.
Le principe de l'asynchrone, c'est pas d'exécuter des choses en même (ça, c'est le parallèlisme), mais d'exécuter des bouts de code dans le désordre, au fil de l'eau des évènements. Dans l'idée, sur AJAX, "asynchrone" signifie qu'on va lancer l'appel AJAX, et lui dire quelle callback rappeler quand il aura terminé. Pendant ce temps, on lance d'autres trucs (eux-mêmes peut-être asynchrones), et quand la requête AJAX reviendra, pouf, la callback sera lancée (en se glissant entre l'exécution de deux autres codes qui tourneront à ce moment-là).

Pour t'en faire une image, lancer la cuisson des carottes avec un minuteur qui bipera quand elle seront cuite, et de partir monter une bibliothèque en chêne pendant ce temps. Quand le minuteur sonne, tu vas t'occuper des carottes (sauf si t'es en plein milieu d'un vissage). T'es tout seul à faire tout ça (tu ne *fais* pas des trucs en parallèle), mais tu es en asynchrone (tu n'attends pas que les carottes soient cuites avant de commencer la bibliothèque).


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

Ma structure :

Evènement n°1 - Clic sur exploration
code qui change le visuel
appel fonction Explorer-Région
[...Suite du code plus tard...]

Function Explorer-Région
appel fonction InfosBaguettes
[...Suite du code plus tard...]

Function InfosBaguettes
code : si le joueur correspond à faction Fée s'active, sinon on saute la fonction
code : récupération par l'AJAX de la baguette en tableau JSON

SUITE Function Explorer-Région
Code : si faction Fée, cherche baguette pour changer image selon baguette
Code : ou sinon si orientation Civilisation, icônes qui changent différemment selon d'autres éléments JSON récupérées (plus tôt ou plus tard) - je précise que l'élément OUTIL n'est pas le même élément que BAGUETTE même si les deux ne vivent jamais simultanément et que les données récupérées sont les mêmes... les premiers s'inscrivent dans la session même si c'est pas spécialement utilises qu'ils s'inscrivent dans la session)

Bon, oui mon code pourrait potentiellement être plus optimisé :p Mais bon, petit à petit je l'optimise, là j'avoue que les sessions des outils ça m'a perturbé pour les baguettes magiques, je me suis dis que ça ne servait à rien (et peut-être que les sessions ne servent à rien pour les outils, mais généralement quand je supprime un élément qui ne me semble servir à rien, derrière j'ai un bug qui survient du fait de la disparition de l'élément en question :p)


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

Ca peut se construire simplement sans tout dé-re-structurer: ta "SUITE" devient une function, avec un paramètre supplémentaire ("infosBaguette"). Si t'es une fée, tu lances ton AJAX, et ta callback de success va appeler cette function "SUITE" en lui passant la baguette. Si t'es pas une fée, tu ne fais pas l'appel AJAX et tu appelles directement la function "SUITE" en lui passant un "null" en guise de baguette (par exemple).


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

EDIT
En fait non j'ai pas capté, j'ai essayé de faire le code comme tu m'as dis mais j'ai pas fais comme tu me dis xD Je retente l'appel de fonction en paramètre.

Code de base :
Code :
function exploration_go() {
    explorer_region();
    apparition_element();
}
function explorer_region(){
        infos_baguette();
    }

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();};
    }

En gros toi tu me dis de juste remplacer ça ? :
Code :
function apparition_element() {
                nature_absorbe(infos_baguettes);
            }

Mais ça ne fonctionne toujours pas :'(

EDIT XMILLE :
En fait non je capte toujours pas >...< Faudrait que je choppe le principe du callback pour comprendre, mais pour le moment je le choppe pas :O


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

Code :
function exploration_go() {
        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'];
                    nature_absorbe(baguette_active);
                },
            });    
        }


function nature_absorbe(baguette_active) {
        if (faction == "Fée" && baguette_active == "Jaunoyante") {
        ....    
}

Quelque chose dans ce style, mais ta variable faction elle est déclaré ou?


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

Code :
faction = "<?php echo $_SESSION['Faction']; ?>";

Mais du coup Dioux, là je saute toute une partie du code (la suite de explorer_region), qui va déterminer tout un tas de choses. (Notamment l'élément naturel apparu et l'action possible face à cet élément).


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


function exploration_go(faction) {
if (faction == "fee") {
return $.ajax({...
success: function (data) {
// data = { type: 'baguette', genre: "jaune", stats: {...}}
action_exploration(JSON.parse(data);
}
});
}
return action_exploration({});
}

function action_exploration(actionInfos) {
if (actionInfos.type == "baguette") {
if (actionInfos.genre == "jaune") {
...
}
else if (... == "vert") {
}
...
}
....
}

Tu vois mieux l'idée? Bon, après, y'a surement plus esthétique, car la pile de "if", bof bof, mais bon.

EDIT:
Heu, nope, faut échapper les choses avant de les balancer dans la page web Smile

var faction = <?php echo json_encode($_SESSION['Faction']); ?>;

Ta variable PHP, c'est des data qu'elle contient. Ces data doivent être codées en JSON avant d'être insérée dans un code Javascript.