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);
}
War es hilfreich?

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));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top