我不应该在 future::stream::Unfold 上调用 next 吗?
Shouldn't I call next on future::stream::Unfold?
我在这个函数返回的 Stream
上多次调用 next
:https://github.com/sdroege/rtsp-server/blob/96dbaf00a7111c775348430a64d6a60f16d66445/src/listener/message_socket.rs#L43:
pub(crate) fn async_read<R: AsyncRead + Unpin + Send>(
read: R,
max_size: usize,
) -> impl Stream<Item = Result<Message<Body>, ReadError>> + Send {
//...
futures::stream::unfold(Some(state), move |mut state| async move {
//...
})
}
有时有效,但有时我得到:
thread 'main' panicked at 'Unfold must not be polled after it returned `Poll::Ready(None)`', /root/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.13/src/stream/unfold.rs:115:21
错误来自https://docs.rs/futures-util/0.3.2/src/futures_util/stream/unfold.rs.html#112
但我不明白为什么。我不应该在流中循环调用 next
吗?
这个错误是有原因的错误,因为它可能意味着你做错了什么:当流 returns Poll::Ready(None)
时,这意味着流已完成(在与 Iterator
类似的方式,如评论所述)。
但是,如果您仍然确定这是您想要执行的操作,那么您可以调用 stream.fuse()
以消除错误并永远简单地 return Poll::Ready(None)
。
我在这个函数返回的 Stream
上多次调用 next
:https://github.com/sdroege/rtsp-server/blob/96dbaf00a7111c775348430a64d6a60f16d66445/src/listener/message_socket.rs#L43:
pub(crate) fn async_read<R: AsyncRead + Unpin + Send>(
read: R,
max_size: usize,
) -> impl Stream<Item = Result<Message<Body>, ReadError>> + Send {
//...
futures::stream::unfold(Some(state), move |mut state| async move {
//...
})
}
有时有效,但有时我得到:
thread 'main' panicked at 'Unfold must not be polled after it returned `Poll::Ready(None)`', /root/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.13/src/stream/unfold.rs:115:21
错误来自https://docs.rs/futures-util/0.3.2/src/futures_util/stream/unfold.rs.html#112
但我不明白为什么。我不应该在流中循环调用 next
吗?
这个错误是有原因的错误,因为它可能意味着你做错了什么:当流 returns Poll::Ready(None)
时,这意味着流已完成(在与 Iterator
类似的方式,如评论所述)。
但是,如果您仍然确定这是您想要执行的操作,那么您可以调用 stream.fuse()
以消除错误并永远简单地 return Poll::Ready(None)
。