JavaScript SDK Facebook API - globale Variablen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • JavaScript SDK Facebook API - globale Variablen

      Hallo Leute,

      und zwar habe ich mir mal das Facebook JS SDK geladen und ein paar Versuche gestartet. Funktionierte auch auf Anhieb ganz gut. Ich kann per Graph auf meine Daten zugreifen und die via JS Console auch im Browser schön ausgeben. Jetzt aber zum Problem.

      Und zwar ruft meine Funktion "getUserData()" zwei Funktionen auf "getEmail()" und "getName()". Diese zwei Funktionen machen nichts, außer per FB.api das entsprechende Graph Objekt holen und dieses in eine globale Variable zu speichern.

      Wenn ich später allerdings auf meine zwei globalen Variablen zugreife, sind diese leider nicht befüllt und ich verstehe nicht wieso. Irgendwie arbeitet das Script meinen Code in komischer Reihenfolge ab.

      Da ich noch nie mit Javascript gearbeitet habe, scheine ich hier irgendetwas grundlegendes falsch zu machen. Wie kann ich den Interpreter zwingen, meine Codereihenfolge einzuhalten?

      Grüße und danke
      eds
      *MacBook Pro 2019*
    • Ich nutze gerade die Globalen Variablen um das Problem zu verstehen. Späte werde ich sicher eine geschicktere Möglichkeit finden. Jetzt aber mal das Beispiel:



      JavaScript-Quellcode

      1. // Globale Variablen
      2. var global1 = 'leer';
      3. var global_email = 'leer';
      4. // Logged into your app and Facebook.
      5. console.log('1');
      6. test();
      7. getEmail();
      8. console.log(global1);
      9. console.log(global_email)
      10. // Testfunktion
      11. function test() {
      12. console.log('2');
      13. global1 = 'test';
      14. return 'test';
      15. }
      16. // Emailadresse auslesen
      17. function getEmail()
      18. {
      19. console.log('3');
      20. FB.api('me?fields=email', function(response)
      21. {
      22. console.log('4');
      23. global_email = response.email;
      24. });
      25. }
      Alles anzeigen
      In der Konsole erhalte ich nun bei den Logs:

      1
      2
      3
      test
      leer
      4

      1, 2 passt ja. Dann wird getEmail() aufgerufen was auch noch passt. Es kommt 3. Danach springt er aber zurück, gibt console.log(global1) und console.log(global_email) aus. Leider ist die global_email aber noch nicht befüllt. Und dann ist er erst bei 4 und befüllt die global_email.

      [Blockierte Grafik: http://forum.jswelt.de/images/smilies/frown.png]
      *MacBook Pro 2019*
    • Die Closure Function im zweiten Parameter der Funktion FB.api wird asynchron ausgeführt sobald der API-Request an Facebook erfolgt ist. Der Code läuft in der Zeit weiter - das ist das schöne an Async. Damit wird vermieden, dass der Browser "hängt" während die Anfragen noch geladen werden.

      Entsprechend solltest darauf verzichten global_email im Closure von FB.api zu beschreiben. Stattdessen solltest du dort direkt das tun, was du auch später mit global_email tun möchtest.

      Es ist Best Practice auf globale Variablen zu verzichten: w3schools.com/js/js_best_practices.asp