#tokio #set-interval #interval #set-timeout #timeout


Allows you to use setInterval(callback, ms) and setTimeout(callback, ms) as in Javascript inside a tokio runtime. The library provides the macros set_interval!(callback, ms) and set_timeout!(callback, ms)

8 stable releases

1.3.0 Jun 25, 2023
1.2.1 Jun 25, 2023
1.2.0 Sep 12, 2022
1.1.0 Jun 15, 2021
1.0.3 May 17, 2021

#147 in Asynchronous

Download history 61/week @ 2023-06-07 75/week @ 2023-06-14 112/week @ 2023-06-21 66/week @ 2023-06-28 82/week @ 2023-07-05 123/week @ 2023-07-12 142/week @ 2023-07-19 131/week @ 2023-07-26 163/week @ 2023-08-02 112/week @ 2023-08-09 237/week @ 2023-08-16 98/week @ 2023-08-23 77/week @ 2023-08-30 150/week @ 2023-09-06 149/week @ 2023-09-13 49/week @ 2023-09-20

471 downloads per month

MIT license

418 lines


The crate tokio-js-set-interval allows you to use setInterval(callback, ms) and setTimeout(callback, ms) as in Javascript inside a tokio runtime (https://tokio.rs/). The library provides the macros:

  • set_interval!(callback, ms),
  • set_interval_async!(future, ms),
  • set_timeout!(callback, ms),
  • and set_timeout_async!(async_callback, ms).

How to use


# don't forget that you also need "tokio" for the tokio runtime!
tokio-js-set-interval = "<latest-version>"


use std::time::Duration;
use tokio_js_set_interval::{set_interval, set_timeout, clear_interval};

async fn main() {
    set_timeout!(println!("hello from timeout"), 25);
    set_interval!(println!("hello from interval"), 10);
    // you can clear intervals if you want
    let id = set_interval!(println!("hello from interval"), 10);

    // give enough time before tokios runtime exits


They behave similar to their Javascript counterparts, with a few exceptions:

  • They only get executed if the tokio runtime lives long enough.
  • on order to compile, the callback must return the union type, i.e. ()
    => all actions must be done via side effects
  • again, there is NO GUARANTEE that the tasks will get executed
    (=> however useful and convenient for low priority background tasks and for the learning effect of course)


I'm not an expert in tokio (or async/await/futures in Rust in general) and I don't know if this follows best practises. But it helped me to understand how tokio works. I hope it may be helpful to some of you too.

The functionality behind is rather simple. However, it took me some time to figure out what kind of input the macros should accept and how the generic arguments of the functions behind the macros need to be structured. Especially the *_async!() versions of the macros were quite complicated during the development.

Compatibility & MSRV

  • MSRV is 1.66
  • Tokio is supported starting with version 1.0. Note that Rust >= 1.73 will deny tokio <1.18.


~101K SLoC