如何将 Future 转换为 Stream?

Sup*_*zir 3 asynchronous rust rust-tokio

我正在尝试使用async_std从网络接收 UDP 数据报。

有一个UdpSocket实现async recv_from,这个方法返回一个未来,但我需要一个async_std::stream::Stream提供UDP数据报流的,因为它是一个更好的抽象。

我发现tokio::net::UdpFramed这正是我需要的,但它在当前版本的 tokio 中不可用。

一般来说,问题是如何将Futures 从给定的异步函数转换为Stream

She*_*ter 5

对于单个项目,请使用FutureExt::into_stream

use futures::prelude::*; // 0.3.1

fn outer() -> impl Stream<Item = i32> {
    inner().into_stream()
}

async fn inner() -> i32 {
    42
}
Run Code Online (Sandbox Code Playgroud)

对于由闭包生成的多个期货的流,请使用stream::unfold

use futures::prelude::*; // 0.3.1

fn outer() -> impl Stream<Item = i32> {
    stream::unfold((), |()| async { Some((inner().await, ())) })
}

async fn inner() -> i32 {
    42
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以使用stream::unfold

use futures::prelude::*; // 0.3.1

fn outer() -> impl Stream<Item = i32> {
    inner().into_stream()
}

async fn inner() -> i32 {
    42
}
Run Code Online (Sandbox Code Playgroud)