Как я уверен, вы обнаружили, что вызов wait()
для фьючерсов является анти-паттерном и в целом побеждает цель асинхронного ввода-вывода (поскольку вы блокируете свой поток - и, следовательно,executor - делает это).
hyper
Маршруты принимают возврат, который реализует IntoFuture
, тип, реализованный для Option<T>
и Result<T, E>
общим способом. Таким образом, то, что вы на самом деле написали, вообще не нужно блокировать - вам просто нужно объединить фьючерсы следующим образом:
if Method::POST == req.method() {
req.into_body().concat2().map(|_body| {
Response::new(Body::from("OK: data submitted"))
})
}
Вы даже не используете содержимое body
в вашем коде, но я предполагаю, что это для целей MCVE. Внутри комбинатора map()
это значение в настоящее время отображается как _body
и позволяет вам делать с ним все, что вы хотите.
Я предполагаю, что вы оказались в этом углу из-за документации - все комбинаторынаходятся на объекте черты FutureExt
;они не определены по признакам Future
и Stream
. В результате они не сразу всплывают при просмотре документа на 0,2 / 0,3, и, возможно, вам показалось, что ваши единственные доступные вызовы были poll_next()
и wait()
.