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);
}
Était-ce utile?

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));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top