*verzweifel* Wieso bekomm ich kein return oder eine var aus einer funct zurück ?!?!?!?!?

  • Ich bin einfach zu blöd x.x


    ausgabe

    Code
    before: sth
    {POST User/login.php 200 OK  231ms	}
    after: sth
    Benutzername ist schon vergeben
    in: true


    Wenn der Benutzer nicht in der DB gefunden wurde, steht in der login.php: false||FUN


    Ahhhhrg.
    Das Return functioniert nicht und das variaben übergeben auchnicht.

  • Also bei after: [x] sollte [x] das gleiche sein wie bei in: [x] .... :/
    Bzw Das Return in .done() funktioniert nicht wie ich will .. Eig, müsste die funct, doch dann abgebrochen werden und der return wert ausgegben werden oder ? ... aber stattdessen gets einfach weiter... die var wird auchnur in .done() veränert und außerhalb nicht :0

  • Wenn ich das jetz richtig verstehe:
    "console.log("after: "+vergeben);" sollte also nicht mehr ausgegeben werden?
    Oder anders: wenn .done returnt, dann soll Ende Gelände der function checkUsernameUsing() ?


    Da liegt wohl das Problem:
    Du setzt ein return in .done, was ja selbst eine function ist.
    Dadurch bist Du aus .done raus, allerdings immernoch in checkUsernameUsing().


    ich kenne mich mit jquery nicht aus, aber evtl geht das hier:

    JavaScript
    function checkUsernameUsing(username){
     ...
     var x = .done(function( output ){}
     if(x === ?){return}
     ...
    }
  • Das Problem welches hier auftritt ist das asynchrone Laden. Wenn du in der Konsole aufmerksam schaust siehst du das "after" noch vor "in" gesetzt wird, zusätzlich hast du 2 unterschiedliche Namensräume für "vergeben", einen in checkUsername() und einen in .done(), dies sind 2 unterschiedliche Variablen und es hat so seinen Grund warum es nicht so einfach ist sie zu verbinden, Semantik, die Auswertung gehört nunmal in die .done() Funktion, nach dem AJAX-Aufruf ist die Aufgabe von checkUsername einfach erfüllt, du hast schließlich die Rückgabe :whistling:


    Wenn dir das Ganze zu unübersichtlich wird geht es auch so:



    Wenn es in JavaScript asynchron wird dann verhält sich der Code nicht wie in PHP, die .done() Funktion wird erst aufgerufen wenn AJAX fertig ist, alles was nach der .done() Funktion an Code folgt wird sofort ausgeführt.

  • @cotton
    Oh yeaaaah *_*
    Naja das done gehört ja zu ajax ... $.ajax().done() desshalb geht es nicht ganz so, aber wenn man var x = $.ajax[...] macht ist x ein Obeject was den Response Text von der Ajax abfrage enthält... einfach danach damit arbeiten statt innen drinnen =)
    Daanke :love:


    Jap Bassi deins ist ja im Prinzip dann ähnlich... -Jetzt weiß ich wo das Problem ist :) -
    Ich hab nur noch nicht so ganz durchblickt was val1 - val4 ist..?
    Und .. bei deiner Version bleibt, dass ich nicht aus der function ein return false/true rausgeben kann... x.x


    Danke euch beiden.


    EDIT

    Zitat

    Wenn es in JavaScript asynchron wird dann verhält sich der Code nicht wie in PHP, die .done() Funktion wird erst aufgerufen wenn AJAX fertig ist, alles was nach der .done() Funktion an Code folgt wird sofort ausgeführt.

    .. da liegt ja auch der Sinn von .done() :D



    ÄÄÄÄHM
    jetzt komm ich aber wieder nicht aus dem namensraum von .done() raus? -:/

  • Guck doch nach :)


    val1 = responseText, val2 = success, val3 = AJAX Objekt (val1 == val3.responseText, val4 = bin ich jetzt überfragt :love:



    Aber warum? Du musst sowieso in der .done() Funktion arbeiten oder mit einer anderen Funktion abfragen ob die .done() Funktion ausgeführt wurde weil deine Variable erst da gesetzt wird und sonst wieder undefined ist, wo willst du denn sonst arbeiten?


  • Jap.. weis auch inzwischen das 3 response text ist, 4 ist undefined ;)


    ähm ja die php Datei gibt nicht unbedngt nur das zurück, deswegen geht nicht -> if(val3) ... mein problem ist:
    ich will irgendwo schreiben könen


    und dafür bräuchte ich ein Return x.x


    Wieso zur Hölle ist

    JavaScript
    var obj = $.ajax({
                    type: "POST",
                    url: "ret.php",
                    data: { username: username, password: 'QWERTZ' }
                });
    var output = obj['responseText'];
    console.log(obj);
    console.log(output);


    outout undefined ?!?!?!
    Binn ich blöd? :S

  • Weil du wie nun schon mehrmals erwähnt in der .done()-Funktion arbeiten musst, da ein AJAX-Aufruf asynchron ist.. Das Zuweisen an obj ist ja schön und gut, passiert aber auch erst nachdem der Aufruf durch ist, während der darauf folgende Code sofort ausgeführt wird.
    Und was genau spricht gegen:

    JavaScript
    .done(function( output ) {
            if (whatever) {
               alert('Du kannst den Benutzernamen nicht benutzen!');
            }
    });


    Nebenbei: Wenn der restliche Fortlauf deines Skriptes komplett davon abhängt, was vom php-Skript zurückkommt, wäre es evtl. sinnvoll, die Asynchronität des AJAX-Aufrufs auszuschalten. Dann wartet das Skript halt und du kannst dein return machen:


    (was ganz nebenbei auch das erste google-Ergebnis ist.. *räusper*)

  • Bitte? Und dann synchron? Ein synchroner AJAX Aufruf stoppt den Browser, 0 FPS, das wars mit tippen? Wieso musst du unbedingt außerhalb von .done() arbeiten, du kannst auch innerhalb der Funktion auf ein Inputfeld zugreifen und es rot markieren während du im Span daneben einen Text einblendest, dafür ist diese Funktion vorhanden sonst bräuchten wir sie nicht. ?(

  • Dann logischerweise wie Basiii gesagt hat auf keinen Fall synchron. Verabschiede dich einfach von deinem return (warum eigentlich?? Sinn??) und mach es wie jeder normale Mensch in der .done() (oder ruf von mir aus in der .done() eine andere Funktion auf mit nem Parameter der deinem return-Wert entspricht wenn du grundsätzlich dagegen bist schon vorhandene Funktionen anhand ihrer vorgesehenen Funktionalität zu benutzen).

  • okay okay, recht habt ihr ja. Aber ich hatte ehrlich gesagt kein Problem beim Tippen, troz LAAANGER ladezeiten... :x
    Naja werde das wohl doch noch anders lösen müssen...


    Danke für die Negativ-konstruktive Betrachtung meiner Lösung :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!