Rust 期货 `try_filter_map` 引起恐慌:'async fn resumed after completion'

Rust futures `try_filter_map` causing panic: 'async fn resumed after completion'

我有一个生成结果的流,我想对这些项目应用 try_filter_map() 并取第一个不会导致错误的项目。

考虑以下示例:(Playground)

use futures::{pin_mut, prelude::*};
use tokio;

#[tokio::main]
async fn main() {
    let s = stream::iter(vec![Ok(1), Ok(2), Ok(3)])
        .try_filter_map(|v| async move { if v == 1 { Err("Ohno!") } else { Ok(Some(v)) } })
        .inspect_err(|err| println!("Error {:?}", err))
        .filter_map(|r| future::ready(r.ok()));
    pin_mut!(s);
    let result = s.next().await;
    println!("{:?}", result);
}

当我 运行 此代码时,我收到以下错误:

Error "Ohno!"
thread 'main' panicked at '`async fn` resumed after completion'

我是 Rust 的新手,需要一些帮助来解决这个问题。

好像是a bug。在新版本修复该问题之前,您似乎在使用 try_filter_map 而未实际过滤流?如果是这种情况,您可以使用 and_then 代替:

let s = stream::iter(vec![Ok(1), Ok(2), Ok(3)])
  .and_then(|v| future::ready(if v == 1 { Err("Ohno!") } else { Ok(v) }))
  .inspect_err(|err| println!("Error {:?}", err))
  .filter_map(|r| future::ready(r.ok()));