• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Ajax- wywołanie calback, a zwrot danych

Object Storage Arubacloud
0 głosów
244 wizyt
pytanie zadane 4 września 2020 w JavaScript przez Wiciorny Ekspert (270,170 p.)
zamknięte 6 września 2020 przez Wiciorny

Witam, kolejny dysonans i problem z mojej strony. Generalnie odbieram dane za pomocą ajax.get, wiem ze są lepsze api, niestety musze korzystać z tego rozwiązania i też  np FETCH API nie mogę uzyć na chwilę obecną.

Próbuje odebrać dane z funkcji ajax,  i przekazać je mapowane do innego pliku JSP gdzie odbieram je do danych w tabeli. Problem jest taki ze o ile funkcja get dobrze pobiera zasób * jest to funkcja wbudowana, to nie mogę za pomocą callback i innych próbowanych przeze mnie mapować i zwrócić tych danych . 
Zwracane mi jest "null, lub undefined" zwykle to drugie i na tej podstawie nic się nie pojawia 
Tak wyglądają funkcje - wewnątrz oczywiście wszystko działa, jednak nie wiem jak moglym odebrany zasób mapować na klucz- wartość i zwrócić do tabeli  [ znajdującej się [ w innym pliku 
 

    
    function extractData() {
        ajaxUtils.get("filtry/pobierzTypJednostek.do", null, async function (data) {
            console.log("Data z urla !");
            console.log(data);
            let returnData = await pobierzTypyJednostek(data);
            return returnData;
        });
    }

 
    function pobierzTypyJednostek(callback_data) {
        let local;
        console.log("Dane w callback");
        local = callback_data;
        console.log(local);
        return Object.entries(local).map(([key, value]) => ({
            id: key,
            name: value
        }));
    }


EDIT: dane nawet jesli sie mapują to chcąc je zapisać w innym pliku np 
 

 let logs = filtry.extractData();
    console.log("Dane w krteri ? ");
    console.log(logs);

Zwracany zostaje  : 

  1. Promise {<fulfilled>: undefined}
    1. __proto__: Promise
    2. [[PromiseState]]: "fulfilled"
    3. [[PromiseResult]]: undefined
komentarz zamknięcia: Problem rozwiązany przy pomocy klasy Promise w JS, informacje w komentarzach
komentarz 4 września 2020 przez Wiciorny Ekspert (270,170 p.)

niestety to stary projekt i mamy tylko jQuery, chodzi o to że dane tutaj mapują się poprawnie otrzymuje je z servera tylko w momencie kiedy w innym pliku scryptowym próbuje przekazać je do zmiennej 

let zmienna = filtry.MojaFunkcja();

to wartość zmiennej zawsze jest undefined.  I tutaj zwracam się z prośbą o pomoc jak otrzymać te dane 

0: {id: "1", name: "Ministerstwo Rodziny, Pracy i Polityki Społecznej"}
1: {id: "2", name: "Wydział ds. pomocy społecznej urzędu wojewódzkiego (Wydział Polityki Społecznej)"}
2: {id: "3", name: "Regionalny ośrodek polityki społecznej"}
3: {id: "4", name: "Obserwatorium integracji społecznej"}
4: {id: "5", name: "Ośrodek pomocy społecznej"}
5: {id: "6", name: "Powiatowe centrum pomocy rodzinie"}
6: {id: "7", name: "Miejski ośrodek pomocy rodzinie"}
7: {id: "8", name: "Dom pomocy społecznej"}

one mają taka postać i w takiej jakby widnieją po wypisaniu na konsole wewnątrz funkcji mapującej "ze zmiennej LOCAL" 

komentarz 4 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Mam przeczucie, że się nie rozumiemy.

function extractData() {
    ajaxUtils.get("filtry/pobierzTypJednostek.do", null, async function (data) {
        console.log("Data z urla !");
        console.log(data);
        let returnData = await pobierzTypyJednostek(data);
        return returnData;
    });
}

Funkcja extractData w powyższej postaci zawsze zwróci undefined - nie ma znaczenia, czy użyjesz jej w tym samym pliku, czy w innym - po prostu nie ma w tej funkcji słówka return, więc ona niejawnie zwraca undefined.

Zapytałem więc skąd bierze się promis, gdy wywołasz filtry.extractData - czy to jest ta sama referencja do funkcji, co extractData? Bo może to jest inna funkcja, która faktycznie zwraca promis, ale wtedy nie jest to sama sama funkcja co extractData pokazana wyżej (i w pierwszym bloczku w Twoim pytaniu).

Inną sprawą jest, że jeśli coś zwraca promisa, to żeby odczytać jego wartość powinieneś albo użyć na promisie metody then, albo poprzedzić promisa operatorem await - i to robisz w callbacku przekazanym do ajaxUtils.get, ale nie przy próbie odczytu wartości zwróconej z metody filtry.extractData.

Pokazałeś też, że metoda filtry.extractData zwraca promisa, który wg loga z konsoli rozwiązuje się do wartości undefined - dla mnie jest to niespójne z powodu opisanego wyżej.

komentarz 4 września 2020 przez Wiciorny Ekspert (270,170 p.)

to w takim razie jak zwrócić

function extractData() {
    ajaxUtils.get("filtry/pobierzTypJednostek.do", null, function (data) {
        console.log("Data z urla !");
        console.log(data);
        return returnData;
    });
}

dane do jakiejś zmiennej gdy nawet wywołanie funkcji  gdzie callback to jest to co po null :) bo to jest success calback z get, to i tak jak w takim razie to returnData, zmapować i obsłuzyć w innej zmiennej ? bo chce te dane  zmapować na tablice i  tę tablice przetworzyc na tabele w html 

sygnatura metody ajaxUtils.get( URL, POST_PARAM, SUCCESS_PARAMS) 

1
komentarz 4 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Spróbuj któryś z poniższych:

function extractData() {
    return ajaxUtils.get("filtry/pobierzTypJednostek.do", null, function (data) {
        console.log("Data z urla !");
        console.log(data);

        return returnData;
    });
}

extractData().then(result => console.log('result', result));

// albo
function extractData() {
    return new Promise((resolve) => {
        ajaxUtils.get("filtry/pobierzTypJednostek.do", null, function (data) {
            console.log("Data z urla !");
            console.log(data);

            resolve(returnData);
        });
    });
}

extractData().then(result => console.log('result', result));

 

komentarz 6 września 2020 przez Wiciorny Ekspert (270,170 p.)
Serdecznie dzięki, faktycznie podszkoliłem swoją wiedze, zastosowałem Promisa.
Dzięki za poświęcony czas i  pomoc w rozwiązaniu problemu, też  sory za problem w wyjasnieniu mojego rozumowania, czy zamysłu ale styczność z frontem mam od niedawna wiec po prostu na bieżąco się wdrażam

1 odpowiedź

0 głosów
odpowiedź 4 września 2020 przez Ehlert Ekspert (212,670 p.)
Proponuję opakować samo ajaxUtils.get w promise'a (o ile już nie ma api na promise'ach) i wtedy zrobić jedna funkcję która proceduralnie będzie strzelać po dane wykorzystując await. Przez to mieszanie promise'ów z callbackami trochę pogubiłeś kontekst.
komentarz 4 września 2020 przez Wiciorny Ekspert (270,170 p.)
ale ja otrzymuje dane i nawet sa one zmapowane tak jak chce, tylko nie mogę je przekazać do innego pliku w którym chce to do zmiennej wysłać.
Bo zwraca mi undefined
komentarz 5 września 2020 przez Ehlert Ekspert (212,670 p.)

przekazać do innego pliku

Sprecyzuj proszę co to znaczy.

komentarz 5 września 2020 przez Wiciorny Ekspert (270,170 p.)
mam plik javascirptowy w którym znajdują się te funkcje, chce przekazać zmapowane dane do zmiennej w scrypcie po stronie JSP, gdzie te dane wpisze do okna MODALNEGO robionego w boostrapie

Podobne pytania

0 głosów
1 odpowiedź 234 wizyt
pytanie zadane 2 kwietnia 2019 w JavaScript przez Steady Obywatel (1,140 p.)
0 głosów
2 odpowiedzi 1,035 wizyt
pytanie zadane 25 sierpnia 2018 w JavaScript przez nielotweb Bywalec (2,240 p.)
0 głosów
1 odpowiedź 319 wizyt
pytanie zadane 7 września 2017 w JavaScript przez kevin Mądrala (5,010 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...