Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Sk8erPeter
    nagyúr

    Nekem az aszinkron ajaxxal az a bajom, hogy a success ágban kéne mindent lekezelni, vagy meghívni egy másik függvényt, míg amikor aszinkron csináltam, akkor tudtam írni ilyen függvényt ami a saját logikámnak jobban feküdt:

    Server.prototype.login = function(username, password){
    var result;
    $.ajax({
    url: "php/server.php",
    type: "POST",
    data: {
    action: "login",
    username: username,
    password: password
    },
    dataType: "json",
    success: function(response){
    if(response.success){
    result = response.success;
    }
    },
    async: false
    });
    return result;
    }

    A rossz eset nincs lekezelve, de az kényelmessé teszi a szinkron hívást, hogy vissza tudok térni belőle, ez alkalmazás szinten így néz ki:

    $("#loginBtn").click(function(){
    uName = $("#unameField").val();
    pwd = $("#pwdField").val();
    if(uName === "" || pwd === ""){
    alert("Missing username or password!");
    } else {
    if(server.login(uName, pwd) == 1){
    // akarmi
    client = new Client(uName, pwd);
    }
    }
    });

    Most ha mindent amit sikeres login után akarnék véghezvinni az ajax succes ágában hívótt metódusban kéne megcsinálni, az rossz lenne :D

    Nagyon nem szép megoldás akkor sem a szinkron (és NEM aszinkron :D) hívás.
    Amit írtál, az is átalakítható, ha megadsz egy callback-függvényre mutató pointert, úgy, hogy paraméterként azt is elvárod:

    Server.prototype.login = function(username, password, successCallback){
    // .............

    $.ajax({
    // ............
    success: successCallback,
    // ........
    });
    // ......
    }

    function successSzarsag() {
    // ide jöhet az, amit sikeres kommunikáció esetén szeretnél csinálni
    }

    $("#loginBtn").click(function(){
    // ..........
    server.login(uName, pwd, successSzarsag);
    // ......
    });

    Most ez csak gyorsan bepötyögött példa volt a kódod alapján, nyomokban hibát tartalmazhat, bár szerintem első ránézésre így működőképes.

    Tényleg picit nehézkes átállni erre a gondolkodásra, erősen más megközelítést igényel, de érdemes végiggondolni, mert blokkolni a UI-t nagyon rossz megoldás.

  • martonx
    veterán

    Nekem az aszinkron ajaxxal az a bajom, hogy a success ágban kéne mindent lekezelni, vagy meghívni egy másik függvényt, míg amikor aszinkron csináltam, akkor tudtam írni ilyen függvényt ami a saját logikámnak jobban feküdt:

    Server.prototype.login = function(username, password){
    var result;
    $.ajax({
    url: "php/server.php",
    type: "POST",
    data: {
    action: "login",
    username: username,
    password: password
    },
    dataType: "json",
    success: function(response){
    if(response.success){
    result = response.success;
    }
    },
    async: false
    });
    return result;
    }

    A rossz eset nincs lekezelve, de az kényelmessé teszi a szinkron hívást, hogy vissza tudok térni belőle, ez alkalmazás szinten így néz ki:

    $("#loginBtn").click(function(){
    uName = $("#unameField").val();
    pwd = $("#pwdField").val();
    if(uName === "" || pwd === ""){
    alert("Missing username or password!");
    } else {
    if(server.login(uName, pwd) == 1){
    // akarmi
    client = new Client(uName, pwd);
    }
    }
    });

    Most ha mindent amit sikeres login után akarnék véghezvinni az ajax succes ágában hívótt metódusban kéne megcsinálni, az rossz lenne :D

    Az async false erősen kerülendő, mert olyankor minden egyéb js futást fagyaszt (pl. js animációknál ez nagyon gáz tud lenni)!!!
    Tudom nehezebb tisztán aszinkron megközelítéssel programozni, tegnap pl. nekem is erősen el kellett gondolkoznom, egy kliens oldali aszinkron hívásnál hiba esetén ismétlő logika megvalósításán (ami végül nem is lett bonyolult), cserébe nagyon megéri tisztán aszinkron programozni.

Új hozzászólás Aktív témák