我有一个由调用async
函数创建的future的Vec
。在将所有futures添加到向量之后,我想要等待整个集合,获取结果的列表或每个完成的回调。
我可以简单地循环或迭代遍历future向量,并在每个future上调用.await
,这样可以正确处理错误并且不会使futures::future::join_all
取消其他future,但是我相信有更符合习惯的方式来完成此任务。
我还想能够在完成时处理futures,因此如果我从前几个得到足够的信息,我可以取消剩余的未完成的futures并且不必等待它们并且丢弃其结果,无论出现错误与否。如果我按顺序迭代向量,则无法实现此目标。
我要寻找的是一个回调(闭包等),让我能够在结果到达时累积结果,以便我可以适当地处理错误或者从回调中确定我不需要其余的future并且取消它们。
我可以看出这会让借用检查器头痛:试图在异步引擎的回调中修改Vec
中的future。
有许多Stack Overflow的问题和Reddit帖子解释了join_all
如何在future列表上进行连接,但如果其中一个失败则取消其余内容,并且异步引擎可能会生成线程,也可能不会,如果它们这样做则是糟糕的设计。
join_all
是在futures
crate中的一个,但由于future::join_all
对future的项是不可知的,如果其中一个future产生错误,它不会取消现有的futures。 - E net4Vec
”表明您有选择不共享的代码。 - Shepmasterfuture::join_all
在失败时会取消其他futures. - John Kugelman