2014-09-01 3 views
-1

Je souhaite envoyer un tableau de nombres entiers à partir d'un fichier php nommé load.php vers un script JS qui l'enverra à son tour dans un fichier Processing écrit en js.Envoi d'un tableau analysé au traitement

Dans le load.php je crée le tableau que je veux envoyer et l'envoyer à l'aide JSON (le tableau est constitué d'au moins 40 Entiers):

echo json_encode($varsArray); 

Dans le fichier principal php nommé game.php est le script:

<script language="JavaScript" type="text/javascript"> 
function js_GetArray() { 
    $.get("load.php", function(actiondata) { 
     var obj = JSON.parse(actiondata); 
     return obj; 
    }); 
} 

en utilisant ce script je demande le tableau de load.php (que je reçois au format JSON), après avoir reçu i l'analyse syntaxique et de l'envoyer dans le fichier de traitement.

Dans le fichier de traitement que je reçois le tableau en tant que tel:

var objArr; 
void setup(){ 
    objArr = js_GetArray(); 

} 
void draw() { 
    alert(objArr[1]); 
} 

Lors de l'activation de l'alerte, je reçois l'erreur:

Uncaught TypeError: Cannot read property '1' of undefined

Comment puis-je résoudre cela et est-il une meilleure façon de envoyer le tableau?

Merci.

+0

@ ClémentMalet Cette partie a été écrite manuellement pour couper toutes les autres codes avant et après, il a été écrit correctement dans le code lui-même et envoie l'erreur peu importe. –

+0

Le problème est que '$ .get' est asynchrone, donc il ne peut pas rendre' js_GetArray' renvoyer 'obj', car la fonction de rappel où vous construisez' obj' sera exécutée plus tard. – Oriol

+0

duplicata possible de [Comment retourner la réponse d'un appel Ajax?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Oriol

Répondre

-1

Votre problème est double. La fonction js_GetArray ne renvoie pas réellement vos données. Vous êtes en train de lire des données du rappel passé à $.get, pas de la fonction js_GetArray

  • exécution asynchrone va vous causer des problèmes. C'est ce qui arrive souvent dans javascript, c'est que vous passez une fonction de rappel, qui est appelée plus tard lorsque le processus est terminé. $.get doit faire une demande à un serveur Web et retourner le contenu. Cela ne peut pas arriver instantanément, alors javascript vous rappelle avec les résultats quand c'est fait. Par conséquent, vous n'obtenez pas les données tant que $.get n'appelle pas le rappel.

    Vous devez faire quelque chose comme:

    var objArr; 
    
    function js_GetArray(callback) { 
        $.get("load.php", function(actiondata) { 
         var obj = JSON.parse(actiondata); 
         callback(obj); 
        }); 
    } 
    
    void setup(){ 
        js_GetArray(function(data) { 
         objArray = data; 
        }); 
    } 
    void draw() { 
        alert(objArr[1]); 
    } 
    

    Vous pouvez lire sur la façon dont le code asynchrone fonctionne en javascript. est ici un article:

    http://recurial.com/programming/understanding-callback-functions-in-javascript/

  • +0

    Pas de commentaires pour expliquer le downvote? Les commentaires nous aident à améliorer les réponses. –

    1

    Vous y êtes presque. AJAX signifie "ASYNCHRONOUS Javascript et XML". Cela dit, votre fonction draw s'exécute alors que l'appel ajax est toujours en cours. Ainsi, le objArr est toujours vide alors.

    Mettre un appel à draw dans le rappel:

    <script language="JavaScript" type="text/javascript"> 
    function js_GetArray() { 
        $.get("load.php", function(actiondata) { 
         var obj = JSON.parse(actiondata); 
         // return obj; doesn't work! 
         draw (obj); 
        }); 
    } 
    
    void draw(objArr) { 
        alert(objArr[1]); 
    } 
    
    +0

    L'utilisation de la méthode de rappel permet d'envoyer le tableau au traitement mais, comme vous l'avez dit, il passe toujours par une boucle de dessin dans laquelle il n'est pas défini. - J'ai peut-être mal compris ce que vous vouliez dire, mais ajouter le tirage au rappel me fait recevoir la réponse indéfinie à chaque fois. –

    +0

    Bien expliqué. Cependant, je * pense * que 'draw' est appelé par le traitement, donc cela ne fonctionnera pas. –

    Questions connexes