有没有办法在 futures for_each 流中继续?
Is there a way to continue within a futures for_each stream?
我正在对通过 mspc::Receiver
接收到的期货流进行 for_each
循环
rx.for_each(move |trade| {
if something_true {
continue;
}
// down here I have computation logic which returns a future
});
我想按照上面的逻辑做一些事情。
当然,我可以只做一个 if/else 语句,但是两个分支必须 return 相同类型的未来,这对我来说很难做到,因为我在计算中生成了未来逻辑是一长串混乱的未来。这让我想到是否真的有一种简单的方法来解决这个问题,比如继续或某种方式?
让我们分别解决这两个问题。首先,最简单的:如果 for_each()
中的期货链不是同质的(它们很少会是同质的),请考虑 return 盒装期货(即 Box<dyn Future<Item = _, Error = _>>
)。您可能需要将闭包 return 类型转换为该闭包,因为编译器有时无法获得您想要执行的操作。
现在,对于 "continue if condition" - 这通常意味着您要过滤掉流中的某些元素,这表明要调用的更好的函数可能包括 filter()
或中间状态 - 即return获取项目类型为 Option<_>
的未来,然后根据链的下一个成员中的那个进行过滤。
不,你不能。 continue
是仅被核心 Rust 语言接受的语法,crate 不能使用它。
您可以 return 提早:
rx.for_each(move |trade| {
if true {
return future::ok(());
}
future::ok(())
});
both branches have to return the same type of future
使用Either
或盒装特征对象
rx.for_each(move |trade| {
if true {
return Either::A(future::ok(()));
}
Either::B(future::lazy(|| future::ok(())))
});
另请参阅:
我可能会将条件移动到流中,这样 for_each
永远不会看到它:
rx.filter(|trade| true)
.for_each(move |trade| future::ok(()));
我正在对通过 mspc::Receiver
for_each
循环
rx.for_each(move |trade| {
if something_true {
continue;
}
// down here I have computation logic which returns a future
});
我想按照上面的逻辑做一些事情。
当然,我可以只做一个 if/else 语句,但是两个分支必须 return 相同类型的未来,这对我来说很难做到,因为我在计算中生成了未来逻辑是一长串混乱的未来。这让我想到是否真的有一种简单的方法来解决这个问题,比如继续或某种方式?
让我们分别解决这两个问题。首先,最简单的:如果 for_each()
中的期货链不是同质的(它们很少会是同质的),请考虑 return 盒装期货(即 Box<dyn Future<Item = _, Error = _>>
)。您可能需要将闭包 return 类型转换为该闭包,因为编译器有时无法获得您想要执行的操作。
现在,对于 "continue if condition" - 这通常意味着您要过滤掉流中的某些元素,这表明要调用的更好的函数可能包括 filter()
或中间状态 - 即return获取项目类型为 Option<_>
的未来,然后根据链的下一个成员中的那个进行过滤。
不,你不能。 continue
是仅被核心 Rust 语言接受的语法,crate 不能使用它。
您可以 return 提早:
rx.for_each(move |trade| {
if true {
return future::ok(());
}
future::ok(())
});
both branches have to return the same type of future
使用Either
或盒装特征对象
rx.for_each(move |trade| {
if true {
return Either::A(future::ok(()));
}
Either::B(future::lazy(|| future::ok(())))
});
另请参阅:
我可能会将条件移动到流中,这样 for_each
永远不会看到它:
rx.filter(|trade| true)
.for_each(move |trade| future::ok(()));