Javascript 如何创建承诺树?

Javascript 如何创建承诺树?,javascript,ember.js,promise,Javascript,Ember.js,Promise,我试图在余烬中创建一棵承诺树 return this.store.find('session', 'session').then(function(session) { if (session.get('isEmpty')) { return this.store.createRecord('session').save().then(function(session) { sessi

我试图在余烬中创建一棵承诺树

        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));
我愿意履行所示的承诺。提到还有嵌套的承诺
createRecord(..).save()。然后
。有可能吗

这里并不是一棵承诺树,因为最后一棵应该为两个分支执行。当然,如果我把它们放在自己的函数中。所以像这样:

'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);
}
最后一个应该为两个分支执行

事实上是的!如果错误处理程序未
抛出
异常,则该错误已被处理,并且承诺将使用处理程序的
返回
值进行解析

有可能吗

对!!这是
然后
的核心属性之一,它通过嵌套的承诺来解决

但是,您可以稍微简化代码,因为其中存在大量重复:

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));

是的,当然有可能。这不管用吗?我的生活是一棵承诺之树……我读到,当你与承诺一起工作时,你应该把它们放在彼此背后,而不是放在内心。有没有办法重构这段代码?我想是链式而不是嵌套式?或者在这种情况下嵌套不是一种坏做法?谢谢你提供的答案!我想我在测试中忽略了一些东西。真正欣赏重构后的答案:)不,如果存在不同的控制流路径,一定程度的嵌套总是必要的。除此之外,承诺提供了压平金字塔的能力,这并不是绝对必要的。在我的代码中,您可以看到3个链式
.then()
调用,只有一个嵌套调用。我认为一个同步示例在这里确实有帮助:)