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