#emitter #events #event-emitter #pubsub #capabilities #subscription

emitter-rs

📢 Emitter RS是一个轻量级的Rust和Wasm的EventEmitter实现

5个版本

0.0.5 2024年6月16日
0.0.4 2024年6月1日
0.0.3 2024年5月31日
0.0.2 2024年5月31日
0.0.1 2024年5月31日

#199 in WebAssembly


用于wasi-sol

MIT 许可证

19KB
178

📢 Emitter RS

Crates.io License

📢 Emitter RS是一个简单的Rust和Wasm的EventEmitter实现,提供易于使用的事件订阅和触发功能。

🚀 快速开始

要开始使用emitter-rs,将其添加到您的Cargo.toml

[dependencies]
emitter-rs = "0.0.5"

然后,您可以在代码中使用它

use emitter_rs::EventEmitter;

fn main() {
    let mut event_emitter = EventEmitter::new();

    event_emitter.on("Say Hello", |value: String| {
        println!("{}", value);
    });

    event_emitter.emit("Say Hello", "Hello world!".to_string());
}

💡 基本用法

只要实现了serdeSerializeDeserialize特质,您就可以发射和监听任何类型的值。单个EventEmitter实例可以监听多种类型的值。

use emitter_rs::EventEmitter;

fn main() {
    let mut event_emitter = EventEmitter::new();

    event_emitter.on("Add three", |number: f32| println!("{}", number + 3.0));

    event_emitter.emit("Add three", 5.0 as f32);
    event_emitter.emit("Add three", 4.0 as f32);
}
// >> "8"
// >> "7"

通过实现serde特质来使用更高级的值类型,如struct

use emitter_rs::EventEmitter;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct Date {
    month: String,
    day: String,
}

fn main() {
    let mut event_emitter = EventEmitter::new();

    event_emitter.on("LOG_DATE", |date: Date| {
        println!("Month: {} - Day: {}", date.month, date.day)
    });

    event_emitter.emit("LOG_DATE", Date {
        month: "January".to_string(),
        day: "Tuesday".to_string()
    });
}
// >> "Month: January - Day: Tuesday"

移除监听器也很简单

use emitter_rs::EventEmitter;

fn main() {
    let mut event_emitter = EventEmitter::new();

    let listener_id = event_emitter.on("Hello", |_: ()| println!("Hello World"));
    match event_emitter.remove_listener(&listener_id) {
        Some(_listener_id) => println!("Removed event listener!"),
        None => println!("No event listener of that id exists")
    }
}

// >> "Removed event listener!"

🌐 创建全局EventEmitter

您可以创建一个全局的EventEmitter实例,该实例可以在多个文件之间共享

// global_event_emitter.rs
use std::sync::Mutex;
use emitter_rs::EventEmitter;
use lazy_static::lazy_static;

// Use lazy_static! because the size of EventEmitter is not known at compile time
lazy_static! {
    // Export the emitter with `pub` keyword
    pub static ref EVENT_EMITTER: Mutex<EventEmitter> = Mutex::new(EventEmitter::new());
}

然后,将此实例导入多个文件

// main.rs
mod global_event_emitter;
use global_event_emitter::EVENT_EMITTER;

fn main() {
    // We need to maintain a lock through the mutex to avoid data races
    EVENT_EMITTER.lock().unwrap().on("Hello", |_: ()| println!("hello there!"));
    EVENT_EMITTER.lock().unwrap().emit("Hello", ());
}

在另一个文件中,您可以通过添加一个监听到全局事件发射器来在main.rs中监听"Hello"事件

// some_random_file.rs
use emitter_rs::event_emitter_file::EVENT_EMITTER;

fn random_function() {
    // When the "Hello" event is emitted in `main.rs`, print "Random stuff!"
    EVENT_EMITTER.lock().unwrap().on("Hello", |_: ()| println!("Random stuff!"));
}

🌟 在WASM中的使用

Emitter RS可以无缝集成到WebAssembly(WASM)项目中,允许您在浏览器中创建事件驱动应用程序。以下是一个示例

use emitter_rs::EventEmitter;
use std::sync::{Arc, Mutex};
use wasm_bindgen_futures::spawn_local;

fn run() {
    let mut event_emitter = EventEmitter::new();
    let result = Arc::new(Mutex::new(String::new()));

    let cloned_result = Arc::clone(&result);

    spawn_local(async move {
        event_emitter.on("some_event", move |value: String| {
            let mut result = cloned_result.lock().unwrap();
            result.push_str(&value);
        });

        event_emitter.emit("some_event", "Hello, world!".to_string());

        assert_eq!(*result.lock().unwrap(), "Hello, world!");
    });
}

[!NOTE] Emitter RS是event-emitter-rs包的维护分支。

📄 许可证

本项目采用MIT许可证

依赖

~1–3.5MB
~69K SLoC