Rust期货`try_filter_map`引起恐慌:“异步fn在完成后恢复”

问题描述

我有一个生成结果的流,我想在这些项目上应用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()));