promise, await/async ou callback

Par Lionel Pérès, il y a 6 ans


Javascript NodeJS

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

Pandazaur, il y a 6 ans

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) } }