Оператор await
Оператор await используется внутри
асинхронных функций и блоков async
для ожидания результата выполнения
Future. Параметром оператор принимает
значение, реализующее трейт Future,
и возвращает его выходное значение после
завершения. Пока Future не готов,
выполнение текущей задачи приостанавливается,
а управление передаётся другим задачам
асинхронного исполнителя.
Оператор await можно применять
только внутри async-контекста.
Он не блокирует поток, а именно приостанавливает
задачу, что позволяет эффективно выполнять
множество асинхронных операций одновременно.
Синтаксис
async fn func()
{
let res = some_future.await;
}
Пример
Давайте создадим простую асинхронную функцию,
которая возвращает число, и дождёмся её
результата с помощью оператора await:
async fn get_value() -> i32
{
12345
}
async fn main_async()
{
let res = get_value().await;
println!("{}", res);
}
fn main()
{
futures::executor::block_on(main_async());
}
Результат выполнения кода:
12345
Пример
Давайте последовательно дождёмся двух асинхронных операций и сложим их результаты:
async fn get_first() -> i32
{
1
}
async fn get_second() -> i32
{
2
}
async fn main_async()
{
let a = get_first().await;
let b = get_second().await;
let res = a + b;
println!("{}", res);
}
fn main()
{
futures::executor::block_on(main_async());
}
Результат выполнения кода:
3
Пример
Давайте дождёмся результата асинхронной функции, возвращающей строку:
async fn get_text() -> String
{
String::from("abcde")
}
async fn main_async()
{
let res = get_text().await;
println!("{}", res);
}
fn main()
{
futures::executor::block_on(main_async());
}
Результат выполнения кода:
"abcde"