使用EventEmitter构建基础的生命周期模型,比如onCreate onUpdate onDestroy,分别在每个阶段console.log一条消息。
比如说,我们构建一个便签管理的EventEmitter
在onCreate时初始化一个library数组
通过调用函数向library中的object Array添加条目,这个条目包含:
{
‘id’: ‘’
‘content’:‘’,
‘color’:‘’,
‘create’:‘’
}
const EventEmitter = require('events');
const uuid = require('uuid');
class NoteManager extends EventEmitter {
constructor() {
super();
this.library = [];
this.on('onCreate', this.onCreate);
this.on('onUpdate', this.onUpdate);
this.on('onDestroy', this.onDestroy);
}
onCreate = (content, color) => {
const note = {
id: uuid.v4(),
content,
color,
create: new Date(),
};
this.library.push(note);
console.log(`Note ${note.id} created`);
};
onUpdate = (id, content, color) => {
const note = this.library.find((n) => n.id === id);
if (!note) {
console.error(`Note ${id} not found`);
return;
}
if (content) {
note.content = content;
}
if (color) {
note.color = color;
}
console.log(`Note ${id} updated`);
};
onDestroy = (id) => {
const index = this.library.findIndex((n) => n.id === id);
if (index < 0) {
console.error(`Note ${id} not found`);
return;
}
this.library.splice(index, 1);
console.log(`Note ${id} destroyed`);
};
}
const manager = new NoteManager();
manager.emit('onCreate', 'note 1', 'yellow');
manager.emit('onCreate', 'note 2', 'green');
manager.emit('onUpdate', manager.library[0].id, 'updated note 1');
manager.emit('onDestroy', manager.library[1].id);
uuid的模块需要安装:
npm install uuid
uuid的模块的作用是什么?
uuid是一个Node.js的第三方模块,用于生成唯一标识符,也就是通常所说的UUID(Universally Unique Identifier)。
在应用程序中,生成UUID的常见场景是为每个新的实体或对象创建一个唯一的ID。UUID是一种具有全球唯一性的标识符,其值在所有计算机上都应该是唯一的,可以确保在分布式系统中使用时不会发生ID冲突。它可以用作数据库表的主键,或者作为文件名、URL、消息ID等等的唯一标识符。
在Node.js中,可以使用uuid模块轻松地生成UUID,而不必编写自己的生成算法。可以使用v1、v3、v4、v5这四个版本的UUID,每个版本都有不同的生成方式和用途。
另一个版本:
使用EventEmitter构建基础的生命周期模型,比如onCreate onUpdate onDestroy,分别在每个阶段console.log一条消息。
比如说,我们构建一个便签管理的EventEmitter
在onCreate时初始化一个library数组
通过调用函数向library中的object Array添加条目,这个条目包含:
{
‘id’: ‘’
‘content’:‘’,
‘color’:‘’,
‘create’:‘’
}
通过sticker.add(content,color)向维护的object Array添加条目,该函数会将一个上述object添加到library中,其中content和color需要提供,否则默认值为’‘和’default’。create为当前时间戳,id为随机生成的16为字母数字字符串。
并且这个函数会触发onUpdate,功能是console.log打印出sticker所有的内容.
在退出时触发onDestroy,输出library中所有stickers中的总字数。
const { EventEmitter } = require('events');
const uuid = require('uuid');
class StickerManager extends EventEmitter {
constructor() {
super();
this.library = [];
this.on('create', this.onCreate);
this.on('update', this.onUpdate);
this.on('destroy', this.onDestroy);
}
onCreate() {
this.library = [];
console.log('StickerManager created');
}
add(content = '', color = 'default') {
const sticker = {
id: uuid.v4(),
content,
color,
create: new Date().getTime(),
};
this.library.push(sticker);
this.emit('update', this.library);
}
onUpdate(stickers) {
console.log(`StickerManager updated with ${stickers.length} stickers:`);
console.log(stickers);
}
onDestroy() {
const totalChars = this.library.reduce((total, sticker) => total + sticker.content.length, 0);
console.log(`StickerManager destroyed, total characters: ${totalChars}`);
}
}
const stickerManager = new StickerManager();
stickerManager.emit('create');
stickerManager.add('Buy milk', 'yellow');
stickerManager.add('Walk the dog');
stickerManager.emit('destroy');