我试着并行运行一组函数,当每个人都完成的时候,我想得到结果,我用了promise,现在我可以把所有的函数放到一个数组里,我可以用Promise,all(函数数组),但是我有数组
[[promise1, promise2], [promise3,promise4], [promise5,promise6]],
其中每个承诺都是承诺函数。承诺参考文档中说参数是承诺。所有应该是可迭代对象,我的数组是可迭代的。但它对我不起作用。我认为它是作为承诺执行[promise1,promise2],而不是单独的承诺。
有谁能帮我实现它吗?或者有没有更好的方法?
7条答案
按热度按时间qxgroojn1#
您还需要为每个数组项调用
Promise.all
:或直接:
这样,外部的
Promise.all
得到其他Promise.all
中的分组承诺:j91ykkif2#
你可以只在所有的内部数组上使用
Promise.all
,然后在外部数组上使用,来获得数组的数组的承诺:注意,
Promise.all
接受一个promise数组,而不是返回promise的函数数组。ojsjcaue3#
另一个选择是将数组的数组扁平化为一个数组,然后直接在该数组上使用
Promise.all()
。直接从MDN上的一个示例开始,可以使用.reduce()
和.concat()
这样做:这个解决方案允许原始promises数组包含单独的promises或promises数组或两者的任意组合。它在这方面很灵活,并且它在一个单一的结果平铺数组中提供结果,这些结果与原始promises的顺序相同,但被平铺到一个单一数组中。因为
Promise.all()
要求您向它传递一个数组,这里提出的其他解决方案要求输入是一个严格的数组--这个数组不能有任何明确的承诺,只有承诺的数组。2这个解决方案在这方面更灵活,可以接受任何一种类型的输入。例如,如果输入恰好是这样的,那么这个方法就能很好地工作:
参见工作演示:https://jsfiddle.net/jfriend00/dLsktyyn/
或者,您可能会发现将
flatten()
函数用于其他用途是很有用的:或者,Javascript数组现在有
.flat()
,它会为您将数组扁平化一层:ctzwtxfj4#
如果你有固定数量的子数组,我建议使用这个简单的解决方案:
几个承诺也可以像这样并行:
如果你有嵌套的承诺数组-试试这个:
jq6vz3qz5#
如果您希望将多阵列扁平化,并兑现所有承诺,现在可以执行以下操作:
xoefb8l86#
这是我的片段。
这就是结果。
[[1, 2], [3, 4]]
dphi5xsq7#
您可以使用以下方法: