Wątek przeniesiony 2016-04-16 10:03 z Webmastering przez dzek69.

undefined zamiast tablicy zwracanej przez funkcję jQuery

0

Hej, licze na szybką pomoc.

Mam taką funkcję w PHP

    // Ajax function
    function getLoggedUser() {
        // If user is logged
        if (isset($_SESSION['user'])) {
            $result = array(
                'status' => 'OK',
                'data' => array($_SESSION['user']['id'],$_SESSION['user']['login'])
            );
        } else {
            $result = array(
                'status' => 'Failed',
                'data' => NULL
            );
            model_Log::saveLog('error', 'Tried to get logged user, but no user logged found', $_GET['controller'], $_GET['action']);
        }
        
        return json_encode($result);
        
    }

, która zwraca mi (oprócz statusu odpowiedzi) id i login użytkownika. Całość enkoduję jsonem.

Funkcyjkę chcę wywołać po stronie klienta poprzez jquery ajax:

function getLoggedUser(base_url) {
    var user = false;
    $.ajax({
        url: base_url+'?controller=User&action=getLoggedUser',
        method: "POST",
        dataType: 'json', 
        success: function(data, textStatus, jqXHR ) { 
            if(data.status === 'OK') {
                user = data.data;
            } else {
                user = false;
            }
        },
        error: function(request, textStatus, errorThrown) {
//            alert(errorThrown);
            user = false;
            
        },
        complete: function(jqXHR, textStatus) {
            // wyświetla czy funkcja zakończyła się sukcesem/błędem
//            alert(textStatus);        
        }
    });
    // method returns user data or "false", otherwise
    return user;
}

Funkcja ajax wykonuje się poprawnie (data.data jak najbardziej daje pożądany wynik), jednak już:

var user = getLoggedUser(base_url);

skutkuje tym, że user[0] i user[1] są undefined.

Rzuci ktoś okiem dlaczego? Siedzę już nad tym, nerwuję się, a podejrzewam, że jak ktoś luknie swiezym okiem to znajdzie mój błąd.

Pozdrawiam

1

Twój ajax call jak sama nazwa wskazuje wykonuje się asynchronizcnie, tzn. funkcja nie czeka aż dostaniesz odpowiedź, tylko zwraca Ci false. Można powiedzieć, że wygląda to tak:

function getLoggedUser(base_url) {
    var user = false;
    setTimeout(function () {
        user = {id: 5, name: 'Kamil'};
        window.user = {id: 5, name: 'Kamil'};
        console.log("Przypisuję do zmiennej user...");
    }, 2000);
    return user;
}
var user = getLoggedUser();
user
//false
window.user
//false

// 2 sek pozniej - Przypisuję do zmiennej user...

user
// wciaz false, bo  funckja przypisuje wartość zmiennej user, do której ma dostęp dzięki "closure" tzn. domknięciu. Reszta świata tego nie widzi
window.user // window to globalny obiekt, wiec widzimy przypisanie
// {id: 5, name: 'Kamil'}
0

@Desu gdzie dokładnie zadeklarować zmienną window.user?

1

@Webowiec nie powinieneś tego robić. Zrobiłem tak tylko dlatego, żeby Ci pokazać, że faktycznie następuje przypisanie. Zależy po co Ci jest ta zmienna, ale możesz użyć Promises:
https://jsfiddle.net/atg5m6ym/3266/

$(document).ready(function() {

  function getLoggedUser(base_url) {
    var dfd = $.Deferred();

    setTimeout(function() {
      dfd.resolve({
        id: 5,
        name: 'Kamil'
      });
    }, 2000);
    return dfd.promise();
  }

  $.when(getLoggedUser()).then(function(user) {
    alert("Pobrałem usera " + user.name);

    $("#logged").click(function() {
      alert(user.name);
    });
  });
});

Jeżeli bardzo byś chciał to przypisać to: http://stackoverflow.com/questions/32612877/how-to-assign-the-returned-value-of-a-promise-to-a-variable, tylko pamiętaj, że cały kod wykona się bez zatrzymywania!!, więc jeżeli robisz od razu coś z tą zmienną user to do momentu pobrania będzie undefined.

1 użytkowników online, w tym zalogowanych: 0, gości: 1