Forcer l'attente d'une promesse ?
Bonjour,
Cela fait plusieurs heures que je me creuse la tête sur un problème d'algorithme, du moins je pense. Lorsque je lance les TU de mon application, la fonction ci-dessous fonctionne 1 fois sur 2 normalement. Je sais que le code en soit est correct et fait ce que j'attends mais la manière dont je l'ai écrit crée parfois des erreurs. Je m'explique. C'est un controller qui vérifie, lors d 'une modification, si certains champs unique ne sont pas déjà existant ou si d'autres données nécessaires sont elle existantes.
Après analyse j'ai remarqué que si je rentre un libellé déjà existant, le temps que la fonction aspectExistByLibelle() qui est une promesse va vérifier le doublon, le code continue et finalement va executer le patchAspect() qui est la fonction demandant au modèle d'update le libelle. Le problème c'est que ce libelle étant unique bah je tombe sur une erreur, qui normalement aurait du être géré par l'aspectExistByLibelle().
Je ne sais pas si je suis très clair, en tout cas je vous joins le code nécessaire à a la compréhension du problème, et si quelqu'un aurait une solution. J'aurai besoin de m'assurer que le patchAspect() attende le retour de aspectExistByLibelle().
Merci par avance pour vos retour,
Seyrinian
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/**
* Vérifié l'existance d'une aspect via son libelle
* @param {String} libelle
* @return {Promise<Boolean|Error>}
*/
const aspectExistByLibelle = function (libelle) {
return new Promise((resolve, reject) => {
AspectModel.findByLibelle(libelle).then(aspect => {
if (aspect) return resolve(true)
return resolve(false)
}).catch(err => {
/* istanbul ignore next */
return reject(err)
})
})
}
/**
* @description Modifier une aspect
* @param {String} req.params.aspectId identifiant de la aspect
* @param {Object} req.body propriété à modifier
* @property {String} req.body.libelle
* @property {String} req.body.description
* @property {String} req.body.adjectives
*/
exports.patchById = (req, res, next) => {
let id = req.params.aspectId
aspectExistById(id).then(response => {
if (response) {
//Check si libelle existe
if (req.body.libelle && req.body.libelle !== '') {
aspectExistByLibelle(req.body.libelle)
.then((aspectFind) => {
if (aspectFind) {
return res.status(400).send({
error: 'Le libellé existe déjà'
})
}
}).catch(err => {
/* istanbul ignore next */
next(err)
})
}
AspectModel.patchAspect(id, req.body)
.then((aspectPatched) => {
EventBus.emit(AspectEventBus.updateAspect, aspectPatched)
return res.status(204).send()
}).catch((err) => {
/* istanbul ignore next */
next(err)
})
} else {
return res.status(404).send({
error: 'L\' aspect n\'existe pas'
})
}
}).catch(err => {
/* istanbul ignore next */
next(err)
})
} |