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

Dlaczego funkcja w JS zwraca undefined?

VPS Starter Arubacloud
+1 głos
415 wizyt
pytanie zadane 19 lipca 2020 w JavaScript przez kingkushlee Gaduła (3,960 p.)
edycja 19 lipca 2020 przez kingkushlee

Jak w temacie.

function getLatest() {

    var latestPost;

    $.ajax({

        url: "https://www.instagram.com/" + settings.instagram_profile + "?__a=1",
        type: "get",

        success: function(result) {
            let temp = result.graphql.user.edge_owner_to_timeline_media.edges[result.graphql.user.edge_owner_to_timeline_media.edges.length - 1];
            let post = {

                image_description: temp.node.edge_media_to_caption.edges[0].node.text,
                image_url: temp.node.display_url,
                image_upload_date: new Date(temp.node.taken_at_timestamp * 1000)

            };

            latestPost = post;
        }

    });

    return latestPost;

}

jednak po wywołaniu

console.log(getLatest());

zostaje zwrócone "undefined"

3 odpowiedzi

+3 głosów
odpowiedź 19 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 28 lipca 2020 przez kingkushlee
 
Najlepsza

Asynchroniczność - funkcja getLatest najpierw zwróci zmienną latestPost mającą wartość undefined. Dopiero później w metodzie success ustawia się konkretna wartość zmiennej latestPost na podstawie odpowiedzi z Ajaxa.

Żeby to obsłużyć, to np. owiń wykonanie Ajaxa w Promise (rozwiązywany wartością zmiennej post) i go zwróć, albo przekaż do funkcji getLatest callback, którego wywołasz w 20 linii z przekazaniem mu zmiennej post.

komentarz 28 lipca 2020 przez kingkushlee Gaduła (3,960 p.)
Dzięki!
+2 głosów
odpowiedź 19 lipca 2020 przez Milesq Nałogowiec (32,020 p.)

ajax jest uruchamiany asynchronicznie, więc w tym momencie kiedy deklarujesz zmienną latestPost ma ona undefined, a inną wartość będzie miała dopiero kiedy zostanie zwrócona odpowiedź z serwera. musisz więc opakować to w obietnicę, albo przyjmować callback do funkcji getLatest. Lepiej też nie używaj już JQuery (https://www.youtube.com/watch?v=JoUrZlcdoFw), tylko fetch api, lub axios'a

http://kursjs.pl/kurs/ajax/promise.php

http://kursjs.pl/kurs/ajax/fetch.php

+1 głos
odpowiedź 20 lipca 2020 przez VBService Ekspert (251,210 p.)
edycja 20 lipca 2020 przez VBService

W jQuery dla $.ajax() wywołania zwrotne (Callback Function) są w następującej kolejności:

  1. beforeSend callback option is invoked; it receives the jqXHR object and the settings object as parameters.
  2. error callback option is invoked, if the request fails. It receives the jqXHR, a string indicating the error type, and an exception object if applicable. Some built-in errors will provide a string as the exception object: "abort", "timeout", "No Transport".
  3. dataFilter callback option is invoked immediately upon successful receipt of response data. It receives the returned data and the value of dataType, and must return the (possibly altered) data to pass on to success.
  4. success callback option is invoked, if the request succeeds. It receives the returned data, a string containing the success code, and the jqXHR object.
  5. promise callbacks — .done(), .fail(), .always(), and .then() — are invoked, in the order they are registered.
  6. complete callback option fires, when the request finishes, whether in failure or success. It receives the jqXHR object, as well as a string containing the success or error code.
function getLatest() {
  
    $.ajax({
 
        url: "https://www.instagram.com/" + settings.instagram_profile + "?__a=1",
        type: "get",
 
        success: function(result) {
            let temp = result.graphql.user.edge_owner_to_timeline_media.edges[result.graphql.user.edge_owner_to_timeline_media.edges.length - 1];
            let post = {
 
                image_description: temp.node.edge_media_to_caption.edges[0].node.text,
                image_url: temp.node.display_url,
                image_upload_date: new Date(temp.node.taken_at_timestamp * 1000)
 
            };

            return post;
        }
 
    });
 
}

z użyciem .done() - link

function getLatest() {
  
    $.ajax({
 
        url: "https://www.instagram.com/" + settings.instagram_profile + "?__a=1",
        type: "get",
 
    })

    .done(function(result) {
        // console.log(result);
        let temp = result.graphql.user.edge_owner_to_timeline_media.edges[result.graphql.user.edge_owner_to_timeline_media.edges.length - 1];
        let post = {
 
             image_description: temp.node.edge_media_to_caption.edges[0].node.text,
             image_url: temp.node.display_url,
             image_upload_date: new Date(temp.node.taken_at_timestamp * 1000)
 
        };

        return post;
    });
 
}

 

Podobne pytania

0 głosów
1 odpowiedź 144 wizyt
0 głosów
1 odpowiedź 157 wizyt
pytanie zadane 12 stycznia 2017 w JavaScript przez TheFunny Gaduła (3,420 p.)
0 głosów
1 odpowiedź 432 wizyt
pytanie zadane 20 grudnia 2017 w JavaScript przez Mateusz8486 Początkujący (330 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...