5 个版本
0.1.4 | 2020年8月12日 |
---|---|
0.1.3 | 2020年8月6日 |
0.1.2 | 2020年8月6日 |
0.1.1 | 2020年8月6日 |
0.1.0 | 2020年8月6日 |
10 in #emitter
472 下载/月
用于 3 个 crate (通过 holochain_client)
21KB
218 行
event-emitter-rs
简单的 EventEmitter 实现。
允许您使用回调订阅事件,也可以触发这些事件。事件的形式为 (字符串, 值),回调的形式为接受一个值参数的闭包。
入门指南
use event_emitter_rs::EventEmitter;
let mut event_emitter = EventEmitter::new();
// This will print <"Hello world!"> whenever the <"Say Hello"> event is emitted
event_emitter.on("Say Hello", |value: ()| println!("Hello world!"));
event_emitter.emit("Say Hello", ());
// >> "Hello world!"
基本用法
只要实现了 serde Serialize 和 Deserialize 特性,我们就可以发出和监听任何类型的数据。单个 EventEmitter 实例可以监听多种类型的数据。
use event_emitter_rs::EventEmitter;
use serde::{Deserialize, Serialize};
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.0"
// >> "7.0"
// Using a more advanced value type such as a struct by implementing the serde traits
#[derive(Serialize, Deserialize)]
struct Date {
month: String,
day: String,
}
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 event_emitter_rs::EventEmitter;
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) => print!("Removed event listener!"),
None => print!("No event listener of that id exists")
}
创建全局 EventEmitter
您可能需要一个可以跨文件共享的单个 EventEmitter 实例;
毕竟,使用 EventEmitter 的主要目的之一就是避免通过多层嵌套函数/类型传递值,并有一个全局订阅服务。
// global_event_emitter.rs
use std::sync::Mutex;
use crate::EventEmitter;
// 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
#[macro_use]
extern crate lazy_static;
mod global_event_emitter;
use global_event_emitter::EVENT_EMITTER;
fn main() {
// We need to maintain a lock through the mutex so we can 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 crate::global_event_emitter::EVENT_EMITTER;
fn random_function() {
// When the <"Hello"> event is emitted in main.rs then print <"Random stuff!">
EVENT_EMITTER.lock().unwrap().on("Hello", |_: ()| println!("Random stuff!"));
}
许可证:MIT OR Apache-2.0
依赖项
~1.3–2MB
~41K SLoC