Фьючерсы Rust `try_filter_map` вызывают панику: 'async fn возобновляется после завершения'

У меня есть поток, который генерирует результат, я хочу применить try_filter_map () к этим элементам и взять первый элемент, который не приводит к ошибке.

Рассмотрим следующий пример: (площадка)

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 и мог бы помочь решить эту проблему.


person B Ludewig    schedule 31.10.2020    source источник


Ответы (1)


Похоже, это ошибка. Пока новый выпуск не устранит проблему, похоже, вы используете 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()));
person Ibraheem Ahmed    schedule 31.10.2020
comment
Ага, похоже, я наткнулся на ошибку. Я сообщил об этом на страницу github, и они уже исправили это! - person B Ludewig; 02.11.2020