我有以下Tokio文档中的以下工作代码,我对其做了一些修改:
// Task
let connection = io::read_exact(socket, buf_read)
.and_then(|(socket, buf_read)| {
println!("Do something with the received data...");
for b in &buf_read {
println!("{}", b);
}
// Write to the socket
let buf_write = vec![19; 30];
io::write_all(socket, buf_write)
})
.then(|res| {
println!("{:?}", res); // Just for testing
//Output: Ok((TcpStream, [19, 19, 19, ...]
println!("Send data...");
let buf_write = vec![18; 10]; // Fill the buffer with some data
//
//How to use the socket contained in res to write the data to the socket
//
Ok(())
});
请注意,它
res
是Result
包含原始套接字的。这使我们可以对同一套接字上的其他读取或写入进行排序。
如何使用中包含的套接字Result
将数据写入套接字?
请首先重新阅读Rust编程语言,特别是有关带有Result的可恢复错误的章节。然后重新阅读您正在使用的库的文档。
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,
链结计算将来何时完成,将未来的结果传递给提供的闭包
f
。无论将来如何得出结论,此功能都可用于确保计算运行。提供的关闭将被产生了
Result
,一旦未来完成。
将此与您正在使用的其他功能进行对比Future::and_then
,重点是:
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
}
也可以看看:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句