第二次尝试给出一个答案,在这里我尝试更加解释一下:
首先,来自RSVP README的一些必要背景:
当您从第一个处理程序返回一个promise时,真棒的部分就来了……这使您可以展平嵌套的回调,并且promise的主要功能是防止带有大量异步代码的程序中的“向右漂移”。
通过从then
应在其之前完成的Promise中返回较晚的Promise,这正是按顺序进行Promise的方式。
将这样的promise视为树是很有帮助的,其中的分支代表顺序的过程,而叶子代表并发的过程。
建立这样的允诺树的过程类似于建立其他种类树的非常常见的任务:维护指针或引用树中您当前正在添加分支的位置,并迭代地添加事物。
正如@Esailija在他的答案中指出的那样,如果您有一组不带参数的承诺返回函数,则可以用来reduce
为您整齐地构建树。如果您曾经亲自实现过reduce,您将理解,reduce在@Esailija的答案背后进行的工作是维护对当前promise(cur
)的引用,并使每个promise在其中返回下一个promise then
。
如果您没有一个很好的均质数组(关于它们接受/返回的参数),保证函数返回函数,或者如果您需要比简单线性序列更复杂的结构,则可以通过维护自己来构建保证树对您要在其中添加新承诺的承诺树中位置的引用:
var root_promise = current_promise = Ember.Deferred.create();
current_promise = current_promise.then(function(){
return
});
current_promise = current_promise.then(function(){
return
});
root_promise.resolve();
您可以使用RSVP.all将多个“叶子”添加到一个“承诺”分支中,从而构建并发和顺序过程的组合。我的投票过于简单,答案很简单。
您还可以使用Ember.run.scheduleOnce('afterRender')来确保在下一个承诺被解雇之前就已渲染了一个承诺中完成的事情-我的说法太复杂了,也显示了一个例子。