Error al utilizar el operador .await en Rust

Publicado por Brisa
hace 3 meses

Hola comunidad, estoy teniendo problemas al utilizar el operador .await en Rust. Estoy intentando realizar una llamada a una función asíncrona, pero estoy obteniendo un error y no puedo encontrar la solución. Aquí les dejo el código:

use std::time::Duration;
use tokio::time::delay_for;

async fn espera() {
    delay_for(Duration::from_secs(2)).await;
    println!("Espera completada.");
}

#[tokio::main]
async fn main() {
    espera().await;
    println!("Programa finalizado.");
}

El error que obtengo al intentar compilar el código es el siguiente:

error[E0277]: the `await` operator can only be used inside an async block
 --> src/main.rs:4:28
  |
4 |     delay_for(Duration::from_secs(2)).await;
  |                            ^^^^^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
error: could not compile `async-await`.

¿Alguien me puede ayudar a entender y solucionar este error? ¡Gracias de antemano!

Rust async await
Respuesta de Gordon Shumway
hace 3 meses

¡Hola Brisa!

El error que estás teniendo se debe a que estás utilizando una versión de tokio en la cual la función delay_for ha sido renombrada o ya no se encuentra disponible bajo ese nombre. En su lugar, deberías usar sleep. Además, asegúrate de tener la versión más reciente de tokio incluida en tu Cargo.toml file y que actives las características necesarias (features) para utilizar el runtime adecuado.

Asegúrate de que tu archivo Cargo.toml tenga una dependencia de tokio similar a:

[dependencies]
tokio = { version = "1", features = ["full"] }

Y aquí tienes cómo debería verse tu código:

use tokio::time::{sleep, Duration};

async fn espera() {
    sleep(Duration::from_secs(2)).await;
    println!("Espera completada.");
}

#[tokio::main]
async fn main() {
    espera().await;
    println!("Programa finalizado.");
}

Recuerda además que al utilizar las funciones async, tu entorno (en este caso, la función main) también debe ser async y es necesario usar el atributo #[tokio::main] para que funcione con el runtime de Tokio.

Con estos cambios tu código debería compilar y ejecutarse correctamente si tienes las versiones adecuadas de Rust y tokio. ¡Espero que eso resuelva tu problema!