Wie erstelle ich einen Baum der Versprechen?
-
21-12-2019 - |
Frage
Ich versuche, in Ember einen Baum der Versprechen zu erstellen.
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));
Ich möchte die Versprechen wie gezeigt einlösen.Erwähnen Sie, dass es auch verschachtelte Versprechen gibt createRecord(..).save().then
.Ist das möglich?
Es handelt sich hier nicht gerade um einen Baum voller Versprechen, da das letzte Versprechen für beide Zweige ausgeführt werden sollte.Es könnte natürlich sein, wenn ich diese in eine eigene Funktion einfüge.Also so:
'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);
}
Lösung
der letzte sollte für beide Zweige ausgeführt werden
Das tut es tatsächlich!Wenn ein Fehlerbehandler dies nicht tut throw
eine Ausnahme, der Fehler wurde behandelt und das Versprechen wird mit aufgelöst return
Wert des Handlers.
Ist das möglich?
Ja!Das ist eine der Kerneigenschaften von then
, dass es mit verschachtelten Versprechen aufgelöst wird.
Sie könnten Ihren Code jedoch ein wenig vereinfachen, da er eine Menge Duplikate enthält:
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));