Odczytanie wartości z asynchronicznej funkcji

0

Dzień dobry,
mam funkcje która pobiera dane z bazy i jak zrobić aby dane zostały wyplute z tej funkcji? Poniższe rozwiązanie nie działa, ponieważ dane wypluwa mi zawsze z wartością 0.

const  PobierzDane = (id) =>
{
  let dane = 0;
  fetch(sciezka_do_bazy+'/sprawdz_czy_uzytkownik_jest_w_zleceniu/?' + new URLSearchParams({
    id: id,
    }))
    .then((res) => res.json())
    .then((data) => { 
     dane = data[0].stan; 
    })
    .catch((error) => {
      console.log(error);
    });

  return dane;
 }

.......

if (PobierzDane(wybranyuzytkownik) >0 )
{
...
}
4

Poczytaj sobie czym jest oraz jak działa Promise - ale tl;dr coś w ten deseń powinno wystarczyć:

const PobierzDane = async (id) => {
    let res = await fetch(
        sciezka_do_bazy + '/sprawdz_czy_uzytkownik_jest_w_zleceniu/?' + new URLSearchParams({ id })
    );

    return (await res.json())[0].stan;
}

if (await PobierzDane(wybranyuzytkownik) > 0) {
    /* ... */
}
2

Po tagach "React" domyślam się, że będziesz chciał z tego skorzystać wewnątrz komponentu Reacta, więc oprócz zaprezentowanego async / await przyda Ci się np hook useEffect żeby móc wywołać tą funkcję asynchroniczną

import React, { useState, useEffect } from 'react';

function App() {
  const [data, setData] = useState(null)
  const [error, setError] = useState(null);

  // W tym miejscu powinna być Twoja funkcja "pobierz dane" w postaci fetch lub async await podobnie jak pokazał Patryk
  useEffect(() => {
    fetch("...")
      .then(response => response.json())
      .then(data => {
          setData(data); // <-- Wynik zapisywany jest do stanu
      })
      .catch(error => {
          setError(error.message); // <-- lub błąd w przypadku jakiegoś problemu
      });
  },[])

  // Teraz na podstawie zapisanego stanu możemy zrobić dowolny warunek
  if (error) { 
    return <>Tymczasowe problemy techniczne...</>;  
  }

  return (
    <div className="App">
      ...
    </div>
  );
}
1
virusek391 napisał(a):

Dzień dobry,
mam funkcje która pobiera dane z bazy i jak zrobić aby dane zostały wyplute z tej funkcji? Poniższe rozwiązanie nie działa, ponieważ dane wypluwa mi zawsze z wartością 0.

if (PobierzDane(wybranyuzytkownik) >0 )
{
...
}

W skrócie - nie da się, przynajmniej nie na first-class citizen, jakim jest np taki if, bez użycia await/async.

Jeśli ten if znajdowałby się w funkcji, to wtedy owszem, dałoby się, np tak:

const PobierzDane = (id) =>
{
  fetch(sciezka_do_bazy+'/sprawdz_czy_uzytkownik_jest_w_zleceniu/?' + new URLSearchParams({id}))
    .then(res => res.json())
    .then(data => { 
      danePobrane(data[0].stan);
    })
    .catch(error => {
      console.log(error);
      danePobrane(0);
    });
}

.......

function danePobrane(pobrane) {
  if (pobrane >0 )
  {
    ...
  }
}

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