我有一系列需要按顺序运行的承诺。
var promises = [promise1, promise2, ..., promiseN];
正在呼叫RSVP。所有将并行执行它们:
RSVP.all(promises).then(...);
但是,我怎样才能按顺序运行它们呢?
我可以像这样手动堆叠它们
RSVP.resolve()
.then(promise1)
.then(promise2)
...
.then(promiseN)
.then(...);
但问题是,promise的数量不同,而且promise数组是动态构建的。
9条答案
按热度按时间stszievb1#
如果数组中已经有它们,那么它们已经在执行了。如果你有一个承诺,那么它已经在执行了。这与承诺无关(即,在这方面,它们与C#
Task
方法不同)。.all
不执行任何操作,只返回一个promise。如果您有一个promise返回函数数组:
或值:
1qczuiv02#
使用ECMAScript 2017异步函数,可以这样做:
现在可以使用BabelJS来使用异步函数
juzqafwq3#
2017年ES7方式。
这将按顺序(一个接一个)执行给定的函数,而不是并行执行。参数
promises
是返回Promise
的函数数组。上面代码的柱塞示例:http://plnkr.co/edit/UP0rhD?p=preview
oymdgrw74#
另一种方法是在
Promise
原型上定义全局sequence函数。然后你可以在任何地方使用它,就像
Promise.all()
示例
pwuypxnk5#
第二次尝试回答,我试图更加解释:
首先,来自RSVP README的一些必要背景:
当你从第一个处理程序返回一个promise时,最棒的部分就来了……这允许你平展嵌套的回调,这是promise的主要功能,它可以防止在有大量异步代码的程序中出现“向右漂移”。
这正是通过从应该在其之前完成的promise的
then
返回后一个promise,从而使promise按顺序进行的方式。将这样一组承诺看作一棵树是很有帮助的,其中分支表示顺序流程,而叶子表示并发流程。
构建这样一棵承诺树的过程类似于构建其他种类树的非常常见的任务:维护一个指针或引用,指向树中当前添加分支的位置,并迭代添加内容。
正如@Esailija在回答中指出的那样,如果你有一个不带参数的promise返回函数数组,你可以使用
reduce
为你巧妙地构建树。如果你曾经为自己实现过reduce,你会明白reduce在@Esailija的答案中的幕后工作是维护对当前promise(cur
)的引用,并让每个promise在其then
中返回下一个promise。如果你没有一个很好的同构数组(相对于它们获取/返回的参数)promise返回函数,或者如果你需要一个比简单的线性序列更复杂的结构,你可以通过在promise树中你想要添加新promise的位置维护一个引用来构建promise目录树:
您可以使用RSVP构建并发和顺序流程的组合。所有这些都可以将多个“叶子”添加到一个promise“分支”中。我因回答太复杂而被否决,这就是一个例子。
您也可以使用Ember.run。scheduleOnce('afterRender')以确保在一个承诺中完成的事情在下一个承诺被触发之前得到实现——我因过于复杂而被否决的回答也显示了一个例子。
bogh5gae6#
只需解决
for
循环:)a0zr77ik7#
我也有类似的问题,我做了一个递归函数,它依次运行函数。
如果您需要收集这些函数的输出:
r1wp621o8#
我想要的基本上是mapSeries,我碰巧在一组值上Mapsave,我想要结果。
所以,我所能做的就是帮助其他人在未来寻找类似的东西。。
(请注意,上下文是一个Ember应用程序)。
ff29svar9#
然后
还可以将promise返回的内容存储在另一个私有var中并将其传递给回调