Есть ли в Rust в настоящее время библиотека, реализующая функцию, аналогичную JavaScript setTimeout и setInverval? - PullRequest
2 голосов
/ 20 февраля 2020

Имеет ли ржавчина в настоящее время библиотечную функцию, аналогичную JavaScript setTimeout и setInverval ?, то есть библиотеке, которая может вызывать несколько setTimeout и setInterval для реализации управления несколькими задачами в в то же время.

Я чувствую, что tokio не особенно удобно использовать. Я полагаю, что это будет использоваться следующим образом:

fn callback1() {
    println!("callback1");
}

fn callback2() {
    println!("callback2");
}

set_interval(callback1, 10);
set_interval(callback1, 20);
set_timeout(callback1, 30);

Конечно, я могу смоделировать функцию, чтобы заставить ее работать:

// just for test, not what I wanted at all
type rust_listener_callback = fn();

fn set_interval(func: rust_listener_callback, duration: i32) {
    func()
}

fn set_timeout(func: rust_listener_callback,  duration: i32) {
    func();
}

Если set_interval реализован таким образом, несколько комбинации, динамические элементы c, добавление и удаление, а также отмена не особенно удобны:

use tokio::time;

async fn set_interval(func: rust_listener_callback, duration: u64) {
    let mut interval = time::interval(Duration::from_millis(duration));
    tokio::spawn(async move {
        loop {
            interval.tick().await;
            func()
        }
    }).await;
}

// emm maybe loop can be removed, just a sample

Хотя, я хочу знать, есть ли для этого библиотека, вместо того, чтобы писать ее самостоятельно.

У меня есть идея, если бы я написал это сам. Как правило, все функции превращаются в очередь задач или дерево задач, и затем tokio::time::delay_for можно использовать для их выполнения по очереди, но детали на самом деле более сложные.

Тем не менее, я думаю, что эта общая возможность, возможно, уже была реализована, но я пока не нашел, поэтому я хочу спросить здесь, большое спасибо.

И что важно, Я надеюсь, что он может поддерживать один поток

...