有没有办法在 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(()));