Comment créer un arbre de promesses ?
-
21-12-2019 - |
Question
J'essaie de créer un arbre de promesses dans Ember.
return this.store.find('session', 'session').then(function(session) {
if (session.get('isEmpty')) {
return this.store.createRecord('session').save().then(function(session) {
session.set('id', 'session');
return session.save();
}.bind(this));
} else {
return session;
}
}.bind(this), function(session) {
return this.store.createRecord('session').save().then(function(session) {
session.set('id', 'session');
return session.save();
}.bind(this));
}.bind(this)).then(function(session) {
this.controllerFor('application').onLanguageChange();
this.set('localStorage.session', session);
return session;
}.bind(this));
Je voudrais exécuter les promesses comme indiqué.Mentionner qu'il existe également des promesses imbriquées createRecord(..).save().then
.Est-il possible de faire ça?
Il ne s’agit pas ici exactement d’un arbre de promesses puisque la dernière doit être exécutée pour les deux branches.Cela pourrait bien sûr être le cas si je les mets dans une propre fonction.Alors comme ça :
'successBranch'.then(function(session) {
setSessionDependents(session);
return session;
}
'failBranch'.then(function(session) {
setSessionDependents(session);
return session;
}
function setSessionDependents(session) {
this.controllerFor('application').onLanguageChange();
this.set('localStorage.session', session);
}
La solution
le dernier doit être exécuté pour les deux branches
C’est effectivement le cas !Si un gestionnaire d'erreurs ne le fait pas throw
une exception, l'erreur a été traitée et la promesse est résolue avec le return
valeur du gestionnaire.
Est-il possible de faire ça?
Oui!C'est l'une des propriétés fondamentales de then
, qu'il résout avec des promesses imbriquées.
Cependant, vous pouvez simplifier un peu votre code, car vous y avez beaucoup de duplications :
return this.store.find('session', 'session').then(function(session) {
if (session.get('isEmpty')) {
throw new Error("no session found");
else
return session;
}).then(null, function(err) {
return this.store.createRecord('session').save().then(function(session) {
session.set('id', 'session');
return session.save();
});
}.bind(this)).then(function(session) {
this.controllerFor('application').onLanguageChange();
this.set('localStorage.session', session);
return session;
}.bind(this));