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
19KB
178 行
📢 Emitter RS
📢 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());
}
💡 基本用法
只要实现了serde
的Serialize
和Deserialize
特质,您就可以发射和监听任何类型的值。单个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