IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

Que faire avec une promesse ?


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Sinbad93
    Homme Profil pro
    Apprenti Dev
    Inscrit en
    Octobre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Dev

    Informations forums :
    Inscription : Octobre 2020
    Messages : 23
    Par défaut Que faire avec une promesse ?
    Bonjour,
    Quelque chose m'échappe, lorsque je fait une requête Fetch asynchrone, je suis dans l'attente de recevoir des données.
    Ensuite je souhaite manipuler ces données, comme par exemple les ajouter dans une array pour pouvoir travailler dessus de manière globale.
    Mais ce qu'il se passe c'est que je travaille sur une array undefined car la promesse ne s'est pas résolu.
    Comment faire pour que mon array push les données reçu uniquement lorsqu'elle sont chargés et pas à l'état de promesse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var allData = [];
     
    function getOneProduct(product_id){
      let data;
      fetch('http://localhost:3000/api/things/' + product_id)
      .then(async response => {
        data = await response.json()
      .then(data => requestData = data);
        allData.push(requestData);
    /* ici je rentre une promise dans mon array, et donc ensuite mon code ne fonctionne pas lorsque je veux travailler sur mon array*/
    }
    )}
     
    console.log(allData); /*me retourne une promise, comment faire à partir de là pour demander à mon code de s'exécuter seulement quand les données sont arrivés ?*/
    J'ai pas mal cherché et cela n'a pas l'air d'être un soucis pour la plupart des développeurs, j'ai peut être raté quelque chose ?
    Alors oui biensur je pourrais utiliser un set timeout random de 1 à 2 s, mais quel interêt ? et personne ne télécharge des données à la même vitesse...

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    Par défaut
    à la place de "allData.push", passez les données à une fonction et vous pourrez ensuite analyser les données dans cette fonction.

  3. #3
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 494
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 494
    Par défaut
    si tu veux separer ta logique de recuperation de data & ta logique de traitement de donnees, ta function peu etre une promesse elle-meme
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const allData = [];
     
    function getOneProduct(product_id) {
        return new Promise(resolve => {
            fetch(`http://localhost:3000/api/things/${product_id}`)
                .then(res => res.json())
                .then(data => {
                    resolve(data);
                })
        });
    }
     
    getOneProduct(tonId)
        .then(data => {
            console.log('data recuperee : ', data);
            allData.push(data);//si jamais tu veux t'en servir ailleur
        });
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  4. #4
    Membre averti Avatar de Sinbad93
    Homme Profil pro
    Apprenti Dev
    Inscrit en
    Octobre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Dev

    Informations forums :
    Inscription : Octobre 2020
    Messages : 23
    Par défaut Les données ne sont pas détéctables
    Bonjour, Merci à tous les deux pour votre aide,
    Doksuri, la proposition n'a rien changé, je ne peux pas travailer directement sur allData tant que je ne suis pas sur que toutes les données sont implantés...
    mathieu, en effet le fait de travailler dans une fonction est intéressant mais finalement ça ne me permet toujours pas de savoir si mes données sont chargées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    var allData = [];
     
    function getOneProduct(product_id){
      let data;
      fetch('http://localhost:3000/api/things/' + product_id)
      .then(async response => {
        data = await response.json()
      .then(data => requestData = data);
        useData(requestData);
    }
    )}
     
     
    function useData(data){
      allData.push(data);
      if (allData.length === 5){
      for (i in allData){
        console.log(allData[i]);
      }}
    }
     
    getOneProduct(/*je passe 5 id avec une boucle*/)
    Voici le résultat, effectivement en mettant une condition avec if, cela permet d'attendre les 5 tours de boucle dans getOneProduct et à ce moment les données sont chargés, mais cela ne me parait pas propre :
    -si les données mettent plus de temps à charger avec une autre connexion ou pour x ou y raison
    -si je dois appeler un autre type de données plus lourdes qui ne seront pas chargés avant la fin de la boucle

    Comment faites vous habituellement pour vous assurez que la promesse est résolu avant de travailler sur les données ?
    Merci de votre attention et de votre aide

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour,
    regarde du côté de Promise.all().

  6. #6
    Membre averti Avatar de Sinbad93
    Homme Profil pro
    Apprenti Dev
    Inscrit en
    Octobre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Dev

    Informations forums :
    Inscription : Octobre 2020
    Messages : 23
    Par défaut
    Bonjour NoSmoking,
    Merci pour ton aide,
    Je connais (théoriquement) Promise.all(), si je ne dis pas de bêtise il me semble que cela sert à enchainer plusieurs promesses en simultanées, mais cela ne permet toujours pas de demander à ton programme d'attendre la résolution de la promesse pour effectuer une tâche en particulier ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Que faire avec une vieille machine ainsi qu'un routeur ?
    Par Freysheur dans le forum Architecture
    Réponses: 0
    Dernier message: 16/07/2020, 19h27
  2. Réponses: 2
    Dernier message: 02/06/2009, 15h04
  3. Réponses: 2
    Dernier message: 12/08/2007, 13h29
  4. Que peut-on faire avec une vue ?
    Par Invité dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 20/10/2005, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo