如何创建承诺的树?(How to create a tree of promises?)

2019-10-20 05:52发布

我试图创造灰烬承诺的树。

        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().then 。 是否有可能做到这一点?

这不正是这里的承诺,因为最后一个应该两个分支执行的树。 这可能是当然的,如果我把那些在自身的功能。 所以像这样的:

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

Answer 1:

最后一个应该两个分支执行

它实际上做! 如果错误处理程序不会throw异常,错误已被处理,并且承诺不与化解return处理程序的价值。

是否有可能做到这一点?

是! 这是核心属性之一then ,它与嵌套承诺解决。

但是,你可以简化你的代码一点点,因为你有一堆重复的有:

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


文章来源: How to create a tree of promises?