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

JavaScript Discussion :

Attente de la résolution d'une promise dans une fonction appelante


Sujet :

JavaScript

  1. #1
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut Attente de la résolution d'une promise dans une fonction appelante
    Bonjour,

    J'essaye de me mettre à Javascript (non sans mal) et je rencontre quelques difficultés avec le traitement d'une tâche asynchrone.
    Je fais une application Angular qui récupère des données stockées via le service Firebase.
    Dans mon component j'ai une interface userItem qui contient entre autre un id et une picture (pour l'URL d'une image de profil).
    Je récupère les URL des fichiers qui sont dans le storage de Firestore via la fonction getDownloadURL() qui est une méthode qui renvoie une promise (traitement asynchrone).

    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
    async getURLPicture(data: UserItem[]) {
     
        const storage = firebase.storage();
        const promises = [];
     
        data.forEach( (item) =>{
          const pathReference = storage.ref(item.userId + '/profile.jpg');
          promises.push(pathReference.getDownloadURL());
        })
     
        const urlsArray = await Promise.all(promises);
     
        for (let index = 0; index < data.length; index++){
             data[index].picture = urlsArray[index];
        }
    }
    Cette fonction marche bien. Elle commence par lancer "en parallèle" les fonctions getDownloadURL() pour récupérer toutes les URL dans un tableau puis elle met à jour les pictures pour chaque user
    Mon problème est qu'elle est appelée dans une autre fonction onRefresh()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      onRefresh(): void {
           .....
           this.getURLPicture(data)
     
           this.source.load(data);
           this.dataState = TableDataState.ready;
      }
    Malheureusement l'affichage, géré par cette fonction onRefresh(), se fait avant que le travail de la fonction getURLPicture ne soit terminé. Résultat les user.picture sont undefined et les photos de profil ne s'affichent pas.
    C'est sans doute une question très simple pour un pratiquant de ce langage mais comment puis je faire pour attendre la fin de l'exécution de la fonction asynchrone getURLPicture dans la fonction qui l'appelle.

    Merci beaucoup

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 440
    Points : 4 942
    Points
    4 942
    Par défaut
    Bonjour,

    Et si vous essayez de retourner le tableau des données avec return et utiliser la fonction de rappel (callback) then :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    async getURLPicture(data: UserItem[]) {
    ....
    return data;
    }
    Puis la fonction onRefresh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    onRefresh(): void {
           .....
           this.getURLPicture(data).then(d=>{
              console.log('Données :',d);//voyez vous cette ligne dans la console ?
              this.source.load(d);
              this.dataState = TableDataState.ready;
           });
     
    }

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 476
    Points : 4 687
    Points
    4 687
    Par défaut
    async va de paire avec await non ? (je n'utilise pas souvent cette syntaxe : je prefere un bon gros .then() )

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    async maFunction(){...}
    await result = maFunction();

  4. #4
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Merci beaucoup Toufik83.
    La solution fonctionne très bien! Je vais juste rajouter un catch en cas de pb avec la callback.

    @Doksuri
    async va de paire avec await non ?
    Oui le await est bien présent dans la fonction getURLPicture (il permet d'attendre la résolution des promises pour récupérer toutes les URL dans un tableau)

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 395
    Points : 15 756
    Points
    15 756
    Par défaut
    je n'ai pas compris ce que cela apporte de mettre "await" à la ligne const urlsArray = await Promise.all(promises);.
    il suffirait de faire le traitement dans "then" non ? comme cela par exemple :
    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
    getURLPicture(data: UserItem[])
    {
     
    	const storage = firebase.storage();
    	const promises = [];
     
    	data.forEach(item => {
    		const pathReference = storage.ref(item.userId + '/profile.jpg');
    		promises.push(pathReference.getDownloadURL());
    	})
     
    	return Promise
    		.all(promises)
    		.then(urlsArray => {
    			urlsArray.forEach((url, index) => {
    				data[index]["picture"] = url;
    			}
    		})
    	;
     
    }
    ou peut être encore plus simple en stockant la valeur après chaque "then" de "getDownloadURL" comme cela :
    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
    getURLPicture(data: UserItem[])
    {
     
    	const storage = firebase.storage();
    	const promises = [];
     
    	data.forEach((item, index) => {
     
    		const pathReference = storage.ref(item.userId + '/profile.jpg');
     
    		promises.push(
    			pathReference.getDownloadURL()
    				.then(url => data[index]["picture"] = url)
    		);
     
    	})
     
    	return Promise.all(promises);
     
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    OoW
    Inscrit en
    Juin 2019
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Ukraine

    Informations professionnelles :
    Activité : OoW

    Informations forums :
    Inscription : Juin 2019
    Messages : 139
    Points : 494
    Points
    494
    Par défaut
    \ô/
    il suffirait de faire le traitement dans "then" non ?
    il me semble aussi

    Peut-être pour une clarification-lisibilité du code, c'est souvent ce que j'entend !

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

Discussions similaires

  1. Le nom d'une fonction appelante
    Par Ishaaq dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 26/11/2016, 19h51
  2. Résolution d'une fonction
    Par wajdibelhaj dans le forum MATLAB
    Réponses: 7
    Dernier message: 16/04/2012, 00h27
  3. [NASM] Problème de variable dans la fonction appelante
    Par Joccd dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 01/04/2009, 14h45
  4. [Prototype] Créer attente dans une fonction
    Par Mind-x dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 30/05/2008, 02h10
  5. Réponses: 3
    Dernier message: 27/01/2008, 20h52

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