【发布时间】:2018-06-13 09:14:42
【问题描述】:
我有一个期货集合,我想将它们组合成一个单一的未来,让它们按顺序执行。
我查看了futures_ordered 函数。它似乎是按顺序返回结果,但期货是同时执行的。
我尝试fold 期货,将它们与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:_]>`
我可能正在接近这个错误,但我已经没有想法了。
【问题讨论】:
-
作为评论而不是答案发布,因为我不知道如何解决它:因为您提供
ok(())- 它返回FutureResult- 作为初始值,fold期望您从闭包的每次迭代中返回一个FutureResult。换句话说,推断的类型太具体了。 -
一个让它们按顺序执行的单一未来——你为什么要做这样的事情?由于您的未来不相互依赖,因此没有明显的理由引入强制序列化。