我有一组 future ,我想将它们组合成一个单一的 future ,让它们按顺序执行。
我查看了 futures_ordered
功能。它似乎按顺序返回结果,但 future 是同时执行的。
我试过 fold
future ,将它们与and_then
结合起来.然而,这对于类型系统来说很棘手。
let tasks = vec![ok(()), ok(()), ok(())];
let combined_task = tasks.into_iter().fold(
ok(()), // seed
|acc, task| acc.and_then(|_| task), // accumulator
);
这会产生以下错误:
error[E0308]: mismatched types
--> src/main.rs:10:21
|
10 | |acc, task| acc.and_then(|_| task), // accumulator
| ^^^^^^^^^^^^^^^^^^^^^^ expected struct `futures::FutureResult`, found struct `futures::AndThen`
|
= note: expected type `futures::FutureResult<_, _>`
found type `futures::AndThen<futures::FutureResult<_, _>, futures::FutureResult<(), _>, [closure@src/main.rs:10:34: 10:42 task:_]>`
我可能正在接近这个错误,但我已经没有想法了。
最佳答案
合并 iter_ok
和 Stream::for_each
:
use futures::Stream;
use futures::future::ok;
use futures::stream::iter_ok;
let tasks = vec![ok(()), ok(()), ok(())];
let combined_task = iter_ok::<_, ()>(tasks).for_each(|f| f);
iter_ok
生成传递项目的流,并且从不抛出错误(这就是为什么有时需要修复错误类型)。传递给 for_each
的闭包然后返回为每个项目运行的 Future
- 这里只是传入的项目。
for_each
然后驱动每个返回的 future 完成,然后再移动到下一个,就像你想要的那样。它还会在遇到第一个错误时中止,并要求内部 futures 在成功时返回 ()
。
for_each
本身会返回一个 Future
,它将失败(如上所述)或在完成时返回 ()
。
test tests::bench_variant_buffered ... bench: 22,356 ns/iter (+/- 1,816)
test tests::bench_variant_boxed ... bench: 8,575 ns/iter (+/- 1,042)
test tests::bench_variant_for_each ... bench: 4,070 ns/iter (+/- 531)
关于rust - 按顺序执行 future 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48081740/