#events #emitter #event-emitter

event-emitter-rs

轻量级 EventEmitter

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

Download history 278/week @ 2024-03-13 30/week @ 2024-03-20 47/week @ 2024-03-27 56/week @ 2024-04-03 41/week @ 2024-04-10 63/week @ 2024-04-17 100/week @ 2024-04-24 50/week @ 2024-05-01 53/week @ 2024-05-08 65/week @ 2024-05-15 290/week @ 2024-05-22 504/week @ 2024-05-29 123/week @ 2024-06-05 142/week @ 2024-06-12 109/week @ 2024-06-19 55/week @ 2024-06-26

472 下载/月
用于 3 个 crate (通过 holochain_client)

MIT/Apache

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