LINUX.ORG.RU

История изменений

Исправление vlad9486, (текущая версия) :

Вытаскивать значение не нужно. Пусть оно всегда будет в какой-то футуре. Скармливаешь рантайму футуру, которая реализует все твое приложение и внутри все делаешь. Для этого в токио есть макрос.

[tokio::main]
async fn main() {
    // ...
}

Он разворачивается во что-то типа

fn main() {
    tokio::runtime::Runtime::new().unwrap().spawn(async {
        // ...
    });
}

Если прямо нужно понять как можно было бы подождать, то попробуй

let mut f = async {
    // code
};
let mut f = unsafe { Pin::new_unchecked(&mut f) };

loop {
    match f.poll() {
        Poll::Pending => (),
        Poll::Ready(x) => break x,
    }
}

Этот цикл вернет x – то, что возвращает тот асинк блок.

Исходная версия vlad9486, :

Вытаскивать значение не нужно. Пусть оно всегда будет в какой-то футуре. Скармливаешь рантайму футуру, которая реализует все твое приложение и внутри все делаешь. Для этого в токио есть макрос.

[tokio::main]
async fn main() {
    // ...
}

Он разворачивается во что-то типа

fn main() {
    tokio::runtime::Runtime::new().unwrap().spawn(async {
        // ...
    });
}

Если прямо нужно понять как можно было бы подождать, то попробуй

let mut f = async {
    // code
};
let mut f = unsafe { Pin::new_unchecked(&mut f) };

loop {
    match f.poll() {
        Poll::Pending => (),
        Poll::Ready(x) => break x,
    }
}

Этот цикл вернет x - то, что возвращает тот асинк блок.