【问题标题】:Is there a way to continue within a futures for_each stream?有没有办法在期货 for_each 流中继续?
【发布时间】:2019-10-01 00:48:07
【问题描述】:

我正在对通过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 语句,但两个分支都必须返回相同类型的未来,这对我来说很难做到,因为我在计算逻辑中生成的未来是一长串混乱的未来.这让我想到是否真的有一种简单的方法可以解决这个问题,比如继续或某种方式?

【问题讨论】:

    标签: rust future


    【解决方案1】:

    让我们分别解决这两个问题。首先,最简单的:如果你在for_each() 中的future 链不是同质的(它们很少会这样),考虑返回一个装箱的future(即Box<dyn Future<Item = _, Error = _>>)。您可能需要对闭包返回进行类型转换,因为编译器有时不会得到您想要执行的操作。

    现在,对于“如果条件继续” - 这通常意味着您要过滤掉流的某些元素,这表明要调用的更好的函数可能包括 filter() 或中间状态 - 即返回其未来项目类型为Option<_>,然后根据链的下一个成员进行过滤。

    【讨论】:

      【解决方案2】:

      不,你不能。 continue 是仅被核心 Rust 语言接受的语法,并且 crates 无法使用它。

      您可以提前返回:

      rx.for_each(move |trade| {
          if true {
              return future::ok(());
          }
      
          future::ok(())
      });
      

      两个分支都必须返回相同类型的未来

      使用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(()));
      

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 1970-01-01
        • 2011-06-15
        • 2011-06-20
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多