Définir le hook useState dans une boucle asynchrone

Marco

Je suis nouveau sur reactJs.

J'essaie de concaténer les résultats en boucle asynchrone, mais quelque chose ne va pas. setState ne sauvegarde pas correctement, quand je l'imprime, je peux voir que c'est un tableau vide, je pense qu'il y a un appel asynchrone à l'intérieur.

Comment puis-je résoudre ça? Veuillez me suggérer.

function App() {

  const [data, setData] = useState({data:[]});

  const handleChildSubmit = (data) => {
    setData(data);
  }

  return (
    <div>
      <Form onChildSubmit={handleChildSubmit} />
      <Results flights={data} />
    </div>
  );
}

const Form = ( {onChildSubmit} ) => {

    const [dati, setDati] = useState([]);

    const onFormSubmit = async (e) => {
        e.preventDefault();

        // Flights search Parameters
        const data = new FormData(e.target);
        const dateFrom = data.get('dateFrom');
        const dateTo = data.get('dateTo');
        const departureDay = data.get('day');
        const placeFrom = data.get('placeFrom');
        const placeTo = data.get('placeTo');
        let dayDeparture;
        const daysDeparture = getDayOfWeekArray(dateFrom,dateTo,departureDay);

        // Loop of Fly Search in range time
        for(let i=0; i < daysDeparture.length; i++){
            dayDeparture = daysDeparture[i];
            axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky')
            .then(res => {

                setDati([...dati, res.data]);
                onChildSubmit(dati);

            })
            .catch(function (error) {
                console.log('error: '+error);
            })
            .finally(function () {
            });
        }

    }
Alex Wayne

Le problème est useStatequ'ici vous donne la dativariable avec une valeur spécifique. Ensuite, votre truc asynchrone se produit et setDati()est appelé plusieurs fois, mais datiil ne change pas tant que le formulaire n'est pas restitué et que vous appelez à onFormSubmitnouveau.

Vous avez quelques options.

Vous ne pouvez ajouter les résultats qu'une seule fois sous forme de tableau.

const results = []

for(let i=0; i < daysDeparture.length; i++){
    dayDeparture = daysDeparture[i];
    const res = await axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky');
    results.push(res.data);
}

// Add all results when all are fetched.
setDati([...dati, ...results])

Ou useReducerqui vous donne de manière fiable la dernière version de l'état, au moment où vous le modifiez, afin que vous n'ayez pas de données périmées.

// Something like...

function reducer(state, action) {
  switch(action.type) {
    case 'append':
      return [...state, action.payload]
  }
}

function YourComponent() {
  const [dati, dispatch] = useReducer(reducer, [])

  const onFormSubmit = async (e) => {
    for(let i=0; i < daysDeparture.length; i++){
        dayDeparture = daysDeparture[i];
        const res = await axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky')
        dispatch({type: 'append', payload: res.data})
    }
  }
}

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Comment définir un état dans une boucle forEach à l'aide du hook useState

Impossible de définir le tableau dans le hook useState

Comment définir correctement l'état dans une boucle dans le composant fonctionnel React à l'aide de useState

Réagir le hook UseState provoquant une boucle infinie

ReactJs hook useState entrant dans une boucle infinie

Comment surmonter le hook useState asynchrone?

Le setter useState() ne se déclenche pas dans une fonction asynchrone (électron)

Contrôler le débit d'un flux asynchrone javascript (dans une boucle)

Réagir le hook useState ne se mettant pas à jour dans useEffect asynchrone

Comment utiliser le hook useState pour définir la valeur dans FormDataConsumer

Appel d'une fonction asynchrone dans une boucle for en JavaScript

Définir une fonction dans une boucle for

Définir une valeur dans une boucle for

Processus asynchrone dans une boucle for javascript

Appel asynchrone dans une boucle javascript for

Un appel asynchrone dans la boucle for provoque une erreur de variable dans le rappel

comment définir le titre dans une boucle for en utilisant vue.js dans cet exemple?

Hook ReactJS useState - comportement asynchrone

Appel d'une fonction de mise à jour d'état dans une fonction de mise à jour d'état - hook useState dans le composant fonctionnel React

Comment définir le nombre maximum d'itérations dans une boucle?

Comment définir une variable d'une boucle dans mon tableau, puis afficher le tableau dans une classe différente?

Valeur initiale dans le hook useState

Définir le délai d'expiration pour une demande asynchrone spécifique dans Spring-boot

Comment utiliser le hook useState pour compter les fréquences d'éléments dans un tableau (React hook useState)?

Le pilote natif MongoDB échoue silencieusement lorsqu'il est appelé dans une boucle asynchrone

Définir une variable enregistrée en boucle et l'utiliser dans un autre rôle

Détecter la fin d'une fonction asynchrone dans une boucle for en JavaScript

OkHttp3 SocketTimeoutException (dans l'application Android) - Comment définir le délai de lecture pour une demande asynchrone?

Comment faire une requête HTTP asynchrone dans une boucle / carte Angular2 et modifier le tableau de boucles d'origine?

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive