Bonjour à tous,

Depuis quelques années, je n'ai pas développé en JS et j'ai besoin de reprendre un script tout simple mais il ne exécute pas dans l'ordre.

Le voici :

getNotificationSounds2(serialOrName, idSound, callback) 
    {
    console.log("1");
        let result="";        
        this.getNotificationSounds(serialOrName, (err, res) => 
        {
            console.log("2");
            res.notificationSounds.forEach(function(item, index) {
                if (item['id'] == idSound) {
                result=item;            
                console.log("3");
                }
            });
        });
    console.log("4");
    return result;
    }

Je me retrouve avec 1 puis 4 puis 2 puis 3

Je sais c'est l'erreur classique de JS en synchrone / asynchrone et j'imagine que c'est tout simple à changer mais j'ai passé l'après midi a essayer de retrouver comment faire.

Une bonne âme pourrait m'aider ?

Merci

1 réponse


Bonjour

Javascript étant une technologie qui fonctionne par boucle d'événements, ça fonctionne ainsi:

Quand tu appelles les fonctions, elles partent dans la boucle d'événements, mais n'attend pas forcément qu'une de tes fonctions soit terminée pour lancer l'exécution de la suivante, à moins que tu choisisses d'utiliser des Promise pour forcer l'attente d'une de tes fonctions. Ce que je te suggère c'est de faire ceci:

// Cette fonction doit retourner une promise
getNotificationSounds(serialOrName, (err, res) =>
        return new Promise((resolve, reject) => {
            // TOUT TON CODE DE LA FONCTION ICI

            // Au lieu de return "res", tu fais un resolve(result) en cas de succès
            resolve(res)

            // ou alors en cas d\'erreur au lieu de return "err", tu reject(err)
            reject(err)
        })
})

Ensuite dans ta fonction tu fais ceci:

async getNotificationSounds2(serialOrName, idSound, callback) 
{
    console.log("1");
        let result="";
        try {
                const res = await this.getNotificationSounds(serialOrName)
                // Continue ici ta fonction "getNotificationSounds" sort par le "resolve"
                console.log("2");
                res.notificationSounds.forEach(function(item, index) {
                    if (item['id'] == idSound) {
                        result=item;            
                        console.log("3");
                    }
                });
                return result
        } catch (e) {
            // Passe ici ta fonction "getNotificationSounds" sort par le "reject"
            console.error(e)
        }
}