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

jak zwrocic wartosc z promise?

0 głosów
76 wizyt
pytanie zadane 12 czerwca w JavaScript, jQuery, AJAX przez VLeniowy Nowicjusz (190 p.)

Witam, mam pytanie z ktorym nie jestem sobie w stanie poradzic. Jak zwrocic wartosc z promise nie przypisujac jej do zmiennej globalnej?

function test(){
    fetch('https://api.exchangeratesapi.io/latest?base=PLN')
    .then(response => {
        return response.json()
    })
    .then(resp => {
        let sprawdzam = resp.rates; 
        return sprawdzam;
    })
}
test();


// ze zmienna globalna
let sprawdzam = '';
function test(){
    fetch('https://api.exchangeratesapi.io/latest?base=PLN')
    .then(response => {
        return response.json()
    })
    .then(resp => {
        sprawdzam = resp.rates; 
        console.log(sprawdzam)
        return sprawdzam;
    })
}
test();

 

1 odpowiedź

+2 głosów
odpowiedź 12 czerwca przez adrian17 Mędrzec (188,800 p.)
wybrane 12 czerwca przez VLeniowy
 
Najlepsza
W skrócie: nie zwracasz. Kod używający `sprawdzam` powinien być wywołany ze środka callbacka w `.then()`, nie poza nim. Pamiętaj że ten kod jest asynchroniczny, ten callback w .then() może wywołać się w dowolnym momencie.

(Jeśli chcesz na to ładniejszą składnię w której to wygląda jak "zwracanie", poczytaj o async/await)
komentarz 12 czerwca przez VLeniowy Nowicjusz (190 p.)
mogłbys mi zademonstrowac jakby to wygladalo?
komentarz 12 czerwca przez adrian17 Mędrzec (188,800 p.)
edycja 12 czerwca przez adrian17

Kod używający `sprawdzam` powinien być wywołany ze środka callbacka w `.then()`, nie poza nim

function test(){
    fetch('https://api.exchangeratesapi.io/latest?base=PLN')
    .then(response => response.json())
    .then(resp => {
        let rates = resp.rates; 

        // tutaj używasz rates
        zrob_cos(rates);
    });
}

Możesz też zwrócić promise i trochę przesunąć miejsce użycia, ale poza organizacją kodu to to na jedno wychodzi:

function test(){
    return fetch('https://api.exchangeratesapi.io/latest?base=PLN')
      .then(response => response.json())
      .then(resp => resp.rates);
}

test().then(rates => {
    // tutaj używasz rates
})

A z async/await to:

async function test(){
    let response = await fetch('https://api.exchangeratesapi.io/latest?base=PLN');
    let resp = await response.json();
    
    let rates = resp.rates; 

    // tutaj używasz rates
    zrob_cos(rates);

    // lub zwracasz
    return rates;
}

// ale to wciąż kod asynchroniczny, więc używając test() trzeba:
test().then(rates => {
    // tutaj używasz rates
})

    // albo w async funkcji:
    let rates = await test();

 

komentarz 12 czerwca przez VLeniowy Nowicjusz (190 p.)
Super, dzieki wielkie za odpowiedz!
komentarz 13 czerwca przez BT101 Dyskutant (8,830 p.)
Można by jeszcze dodać `try { await... } catch(e) { ... }` żeby obsłużyć błąd przy fetchowaniu

Podobne pytania

+1 głos
0 odpowiedzi 36 wizyt
0 głosów
1 odpowiedź 49 wizyt
0 głosów
3 odpowiedzi 180 wizyt
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

64,913 zapytań

111,382 odpowiedzi

234,401 komentarzy

46,749 pasjonatów

Przeglądających: 114
Pasjonatów: 3 Gości: 111

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...