Promesses de nidification avec la mangouste
Question
J'ai une promesse que j'utilise pour manipuler des bases de données avec Mongoose.En utilisant la bibliothèque mpromise, je prends teamMatch
et l'utiliser pour mettre à jour le Team
document.Cependant, le programme ne fait rien au-delà de la ligne où je mets à jour le Team
(commencez par var getTeamPromise).
Comment puis-je modifier ce code pour pouvoir faire plus facilement ce que j'ai décrit ci-dessus ?
saveTeamMatch.then(
function saveTeamMatchToTeam(teamMatch) {
console.log('TEAM_MATCH in SAVE to TEAM', teamMatch); //works
// when a team is gotten and a teamMatch is made and saved
// save the teamMatch to the team
var getTeamPromise = Team.findOneAndUpdate( { id:1540 }, { $push:{ matches:teamMatch } } ).exec()
.then(
function successfullySaveTeamMatchToTeam(team) {
console.log('TEAM in SUCCESSFUL SAVE', team);
getTeamPromise.resolve();
},
function failToUpdateTeam(err) {
console.error( err );
getTeamPromise.resolve();
}
)
.resolve(
function endFindMatchPromise() {
saveTeamMatch.end();
}
);
},
function failToSaveTeamMatch(err) {
console.error(err);
saveTeamMatch.end();
}
);
La solution
Il semble que vous ayez mal compris certaines choses à propos des Promesses :
Donné getTeamPromise.then(onResolve, onReject)
:
- Dans onResolve et onReject, la promesse est déjà résolue/rejetée, vous ne pouvez donc pas modifier son état en appelant solve sur la même promesse.
- Votre solve(function()) devrait être le résultat traité à partir du résultat du premier, puis
- Normalement, vous ne devez pas manipuler l'état des promesses, et la plupart des méthodes que vous appelez sont des méthodes internes permettant de créer et de remplir des promesses.
- Le renvoi d'une promesse à partir d'un gestionnaire onResolve redirigera cette promesse ou cette valeur vers le prochain
then
Permettez-moi d'écrire ceci d'une manière (probablement) efficace :
saveTeamMatch.then(function saveTeamMatchToTeam(teamMatch) {
console.log('TEAM_MATCH in SAVE to TEAM', teamMatch); //works
// when a team is gotten and a teamMatch is made and saved
// save the teamMatch to the team
return Team
.findOneAndUpdate({id:1540}, {$push:{matches:teamMatch}}).exec()
.then(function successfullySaveTeamMatchToTeam(team) {
console.log('TEAM in SUCCESSFUL SAVE', team);
return team;
}, function failToUpdateTeam(err) {
console.error('failedToUpdateTeam', err);
});
},function failToSaveTeamMatch(err) {
console.error('saveTeamMatch failed', err);
})
.end();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow