如何解决如何将流转换为未来?
我有一个异步Stream
,我想从中获取第一个值。我该怎么办?
use futures::Stream; // 0.3.5
async fn example<T>(s: impl Stream<Item = T>) -> Option<T> {
todo!("What goes here?")
}
解决方法
您可以使用StreamExt::next
:
use futures::{Stream,StreamExt}; // 0.3.5
async fn example<T>(mut s: impl Stream<Item = T> + Unpin) -> Option<T> {
s.next().await
}
您可以使用StreamExt::into_future
:
use futures::{FutureExt,Stream,StreamExt}; // 0.3.5
async fn example<T>(s: impl Stream<Item = T> + Unpin) -> Option<T> {
s.into_future().map(|(v,_)| v).await
}
在极少数情况下,您可能希望使用future::poll_fn
来完全控制:
use futures::{future,task::Poll,StreamExt}; // 0.3.5
async fn example<T>(mut s: impl Stream<Item = T> + Unpin) -> Option<T> {
future::poll_fn(|ctx| {
// Could use methods like `Poll::map` or
// the `?` operator instead of a `match`.
match s.poll_next_unpin(ctx) {
Poll::Ready(v) => {
// Do any special logic here
Poll::Ready(v)
}
Poll::Pending => Poll::Pending,}
})
.await
}
另请参阅:
更广泛地
如果您希望对流中的所有值进行操作以产生单个值,则可以使用StreamExt::fold
:
use futures::{Stream,StreamExt}; // 0.3.5
async fn example(s: impl Stream + Unpin) -> usize {
s.fold(0,|st,_| async move { st + 1 }).await
}
如果您想对流中的所有值进行操作而不产生任何值,则可以使用StreamExt::for_each
:
use futures::{Stream,StreamExt}; // 0.3.5
async fn example<I: std::fmt::Debug>(s: impl Stream<Item = I> + Unpin) {
s.for_each(|i| async {
dbg!(i);
})
.await;
}
另请参阅:
Unpin
这些示例都要求传入的Stream
实现Unpin
。您也可以自己通过Box::pin
或pin_mut!
宏来固定流。
另请参阅:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。