Я работаю с tokio
и hyper
для создания нескольких задач.
// Defining the task
let task = self.some_future_using
.map(move |resp| println!("OK: {}", resp))
.map_err(move |e| println!("Error: {}",e));
// Spawning the task
tokio::spawn(task);
Вместо того, чтобы просто регистрировать результаты, я хотел бы отправить результат по ограниченному каналу Tokio.
// Defines the channel
let (tx, rx) = mpsc::channel(10);
// Defining the task
let task = self.some_future_using
.map(|resp| /* Send Ok(resp) to tx */ )
.map_err(|e| /* Send Err(e) to tx */);
// Spawning the task
tokio::spawn(task);
Поскольку оба замыкания могут пережить область действия, в которой определено tx
, нам необходимо клонировать и переместить tx
для обоих замыканий:
// Defines the channel
let (tx, rx) = mpsc::channel(10);
let mut tx_ok = tx.clone();
let mut tx_err = tx.clone();
// Defining the task
let task = self.some_future_using
.map(move |resp| tx_ok.try_send(Ok(())).unwrap() )
.map_err(move |e| tx_err.try_send(Ok(())).unwrap() );
// Spawning the task
tokio::spawn(task);
В случае, если больше логикидобавленный с использованием комбинаторов (map
, and_then
и т. д.), для каждого замыкания потребуется собственная клонированная версия tx
.
Является ли клонирование единственным решением?Можем ли мы достичь того же, не клонируя отправителя канала для каждого объявленного закрытия, которое его использует?