Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rust目前是否有类似于JavaScript的库实现函数';s setTimeout和setInverval?_Rust_Async Await_Rust Tokio - Fatal编程技术网

rust目前是否有类似于JavaScript的库实现函数';s setTimeout和setInverval?

rust目前是否有类似于JavaScript的库实现函数';s setTimeout和setInverval?,rust,async-await,rust-tokio,Rust,Async Await,Rust Tokio,rust目前是否具有类似于JavaScript的setTimeout和setInverval?的库实现功能,即,可以调用多个setTimeout和setInterval来同时实现多个任务的管理的库 我觉得东京使用起来并不特别方便。我想象它是这样使用的: fn callback1() { println!("callback1"); } fn callback2() { println!("callback2"); } set_interval(callback1, 10);

rust目前是否具有类似于JavaScript的
setTimeout
setInverval
?的库实现功能,即,可以调用多个
setTimeout
setInterval
来同时实现多个任务的管理的库

我觉得东京使用起来并不特别方便。我想象它是这样使用的:

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_间隔,则多个组合、动态添加和删除以及取消并不特别方便:

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_逐个执行,但细节实际上更复杂

不过,我认为这项一般能力可能已经实施,但我暂时还没有发现,所以我想在这里问一下,非常感谢


重要的是,我希望它能够支持单线程

几天前我问了自己同样的问题,为这个问题创建了一个解决方案(用于运行时),并且刚刚找到了你的stackoverflow帖子

代码.rs

use std::time::Duration;
use tokio_js_set_interval::{set_interval, set_timeout};
#[tokio::main]
async fn main() {
    println!("hello1");
    set_timeout!(println!("hello2"), 0);
    println!("hello3");
    set_timeout!(println!("hello4"), 0);
    println!("hello5");
    // give enough time before tokios runtime exits
    tokio::time::sleep(Duration::from_millis(1)).await;
}
但必须谨慎使用。不能保证将来会执行(因为tokios运行时必须运行足够长的时间)。仅在以下情况下使用:

  • 出于教育目的
  • 如果您有低优先级的后台任务,您不希望总是执行这些任务

几天前,我问了自己同样的问题,为这个问题创建了一个解决方案(针对运行时),刚刚找到了你的stackoverflow帖子

代码.rs

use std::time::Duration;
use tokio_js_set_interval::{set_interval, set_timeout};
#[tokio::main]
async fn main() {
    println!("hello1");
    set_timeout!(println!("hello2"), 0);
    println!("hello3");
    set_timeout!(println!("hello4"), 0);
    println!("hello5");
    // give enough time before tokios runtime exits
    tokio::time::sleep(Duration::from_millis(1)).await;
}
但必须谨慎使用。不能保证将来会执行(因为tokios运行时必须运行足够长的时间)。仅在以下情况下使用:

  • 出于教育目的
  • 如果您有低优先级的后台任务,您不希望总是执行这些任务

在要延迟的异步代码开头添加
delay\u有什么问题吗?@Boiethios-emmm,谢谢你,但我不知道你是否理解我的全部意图,这里不仅仅是一个延迟,至少是针对
setTimeout
部分。你使用
Interval
错误:这是一个流,所以它必须处理“多重组合、动态添加和删除以及取消”。@mcarton也许我对stream不太了解,但我认为使用stream的方法来管理任务不是很方便。我查看了的一些相关部分的实现,似乎没有使用这些方法。是否有进一步的信息或示例?谢谢你把
delay\u放在你想延迟的异步代码的开头有什么问题吗?@Boiethios-emmm,谢谢你,但我不知道你是否理解我的全部意图,这里不仅仅是一个延迟,至少是针对
setTimeout
部分。你使用
Interval
错误:这是一个流,所以它必须处理“多重组合、动态添加和删除以及取消”。@mcarton也许我对stream不太了解,但我认为使用stream的方法来管理任务不是很方便。我查看了的一些相关部分的实现,似乎没有使用这些方法。是否有进一步的信息或示例?谢谢你