Ключевое слово async
Ключевое слово async применяется перед
объявлением функции или перед блоком кода и
превращает их в асинхронную операцию. Такая
функция не выполняется сразу при вызове, а
возвращает значение, реализующее типаж
Future. Чтобы получить результат,
такое значение нужно дождаться с помощью
оператора await внутри другой
асинхронной функции или блока. Параметров
само ключевое слово не принимает.
Синтаксис
async fn name()
{
// body
}
Пример
Давайте объявим асинхронную функцию, которая возвращает число, и дождёмся её результата:
async fn get_value() -> i32
{
42
}
fn main()
{
let res = get_value();
println!("future created");
}
Результат выполнения кода:
"future created"
Пример
Давайте создадим асинхронный блок и получим
из него значение через await:
async fn get_value() -> i32
{
42
}
fn main()
{
let res = async
{
get_value().await + 1
};
println!("async block created");
}
Результат выполнения кода:
"async block created"
Пример
Давайте объявим асинхронную функцию с параметром и дождёмся её вызова внутри другой асинхронной функции:
async fn double(x: i32) -> i32
{
x * 2
}
async fn run() -> i32
{
double(21).await
}
fn main()
{
let res = run();
println!("run future created");
}
Результат выполнения кода:
"run future created"
Пример
Давайте проверим, что вызов асинхронной функции возвращает Future, а не готовое значение:
async fn get_value() -> i32
{
12345
}
fn main()
{
let res = get_value();
println!("value is not computed yet");
}
Результат выполнения кода:
"value is not computed yet"