async fn action(input: Option) -> Option { // 若 input(输入)是None,则返回 None // 事实上也可以这么写: `let i = input?;` let _i = match input { Some(input) => input, None => return None, }; // 这里定义一些逻辑 Some("test".into()) } #[tokio::main] async fn main() { let (tx, mut rx) = tokio::sync::mpsc::channel(128); let mut done = false; let operation = action(None); tokio::pin!(operation); tokio::spawn(async move { let _ = tx.send(1).await; let _ = tx.send(3).await; let _ = tx.send(2).await; }); loop { tokio::select! { res = &mut operation, if !done => { println!("res = &mut operation, done={}", done); done = true; if let Some(v) = res { println!("GOT = {}", v); return; } } Some(v) = rx.recv() => { println!("Some(v={}) = rx.recv()", v); if v % 2 == 0 { // `.set` 是 `Pin` 上定义的方法 operation.set(action(Some(v))); done = false; } } } } }