节点
效应方案专用节点Js公用事业. 此软件包提供 用于使用结构化的节点流和事件发射器工作的适配器 货币.
安装
npm install @effectionx/node
模块
这个包提供了两个子模块:
@effectionx/node/stream- 节点水电流@effectionx/node/events- 节点Js活动设备
您也可以从主模块导入全部 :
import { fromReadable, on, once } from "@effectionx/node";
流线公用事业
从可读()
将可读流转换为效果流 .
import fs from "node:fs";
import { each, main } from "effection";
import { fromReadable } from "@effectionx/node/stream";
await main(function* () {
const fileStream = fs.createReadStream("./data.txt");
for (const chunk of yield* each(fromReadable(fileStream))) {
console.log(new TextDecoder().decode(chunk));
yield* each.next();
}
});
返回的流出 Uint8Array 块并自动清理
关闭流或关闭操作时的事件听众.
水电费
日期( )
创建来自任何事件Emitter或类似事件目标对象的事件流 .
这项工作涉及:
- 节点.js 事件发送器(使用)
on编号 :off(中文(简体) ) - DOM 事件目标( 使用)
addEventListener编号 :removeEventListener(中文(简体) ) - 网络工人全球
self对象
import { each, main } from "effection";
import { on } from "@effectionx/node/events";
await main(function* () {
// With Node.js EventEmitter
for (const [chunk] of yield* each(on(stream, "data"))) {
console.log("data:", chunk);
yield* each.next();
}
// In a worker thread (EventTarget style)
for (const [event] of yield* each(on(self, "message"))) {
console.log("received:", event.data);
yield* each.next();
}
});
对于事件Emitters,事件会作为参数阵列释放出. 对于事件目标,事件作为包含以下内容的单元素阵列发射: 事件对象.
一次( )
创建一个输出下一个事件由事件 Emitter 释放的操作 或类似事件目标的对象.
import { main } from "effection";
import { once } from "@effectionx/node/events";
await main(function* () {
// Wait for a single message (EventTarget style)
const [event] = yield* once(self, "message");
console.log(event.data);
// Wait for a single event (EventEmitter style)
const [code] = yield* once(process, "exit");
console.log("Process exited with code:", code);
});
类型脚本支持
所有出口都包括了TypeScript类型定义. 事件函数支持 类型安全事件处理的通用类型参数 :
import { once, on } from "@effectionx/node/events";
// Type the event arguments
const [code] = yield* once<[number]>(process, "exit");
// Type the stream events
for (const [data] of yield* each(on<[Buffer]>(stream, "data"))) {
// data is typed as Buffer
yield* each.next();
}
接口
事件公用设施与执行这些接口的任何对象合作:
// Node.js EventEmitter style
interface EventEmitterLike {
on(event: string, listener: (...args: unknown[]) => void): void;
off(event: string, listener: (...args: unknown[]) => void): void;
}
// DOM EventTarget style
interface EventTargetLike {
addEventListener(event: string, listener: (event: unknown) => void): void;
removeEventListener(event: string, listener: (event: unknown) => void): void;
}