Для начала перечитайте Язык программирования Rust a >, в частности, глава о Исправимые ошибки с результатом. Затем еще раз прочтите документацию для библиотеки, которую вы используете.
Future::then
, курсив мой:
fn then<F, B>(self, f: F) -> Then<Self, B, F>
where
F: FnOnce(Result<Self::Item, Self::Error>) -> B,
B: IntoFuture,
Self: Sized,
Цепочка вычислений для завершения будущего, передача результата future в предоставленное закрытие f
.
Эту функцию можно использовать для обеспечения выполнения вычислений независимо от вывода в будущем. Предоставленное закрытие будет получено Result
, когда будет завершено будущее.
Сравните это с другой функцией, которую вы используете, _ 5_, акцент мой:
fn and_then<F, B>(self, f: F) -> AndThen<Self, B, F>
where
F: FnOnce(Self::Item) -> B,
B: IntoFuture<Error = Self::Error>,
Self: Sized,
Выполните другое будущее после того, как оно будет успешно решено.
Эта функция может использоваться, чтобы связать два фьючерса вместе и гарантировать, что окончательное будущее не будет решено до тех пор, пока оба фьючерса не закончатся. Предоставленное закрытие дает успешный результат этого будущего и возвращает другое значение, которое может быть преобразовано в будущее.
Одно из решений - обработать его только в случае успеха через and_then
:
extern crate tokio; // 0.1.7
use tokio::{io, net::TcpStream, prelude::*};
fn example(socket: TcpStream, buf_read: Vec<u8>) {
io::read_exact(socket, buf_read)
.and_then(|(socket, buf_read)| {
let buf_write = vec![19; 30];
io::write_all(socket, buf_write)
}).and_then(|(socket, data)| {
let buf_write = vec![18; 10];
io::write_all(socket, buf_write)
});
// TODO: use future somehow
}
Если вы хотите узнать об ошибке, вы можете продолжать использовать then
, но вам придется как-то справиться с ошибкой:
fn example(socket: TcpStream, buf_read: Vec<u8>) {
io::read_exact(socket, buf_read)
.and_then(|(socket, buf_read)| {
let buf_write = vec![19; 30];
io::write_all(socket, buf_write)
}).then(|res| match res {
Ok((socket, data)) => {
let buf_write = vec![18; 10];
io::write_all(socket, buf_write)
}
Err(e) => {
// Do something with the error and return another
// future that's type-compatible
unimplemented!()
},
});
// TODO: use future somehow
}
Смотрите также:
person
Shepmaster
schedule
24.08.2018
split
также. - person squiguy   schedule 24.08.2018