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()
调用,只有一个嵌套调用。我认为一个同步示例在这里确实有帮助:)