


























import { once, EventEmitter } from 'node:events';
import process from 'node:process';
//定义一个 事件喇叭
const ee = new EventEmitter();
process.nextTick(() => {
//在异步队列里 喇叭发消息
ee.emit('myevent', 42);
});
// 只处理一次的监听器,在主流程执行完后,会听到这个消息
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
// 在异步队列里 喇叭发消息,但这次发的是一个 nodejs bug 设计,'error'是 nodejs hardcode 的 key ,你发这个消息相当于抛异常
ee.emit('error', err);
});
try {
//虽然你没有监听'error', 但是 nodejs 内部强迫你监听了
await once(ee, 'myevent');
} catch (err) {
//虽然只是发了个消息,但是确抛了个异常
console.error('error happened', err);
}
这个是大傻逼设计,消息是消息,异常是异常,违反 solid 原则,后来的 bunjs 运行时 不鼓励使用这种方式控制流程,
一般会使用 promise ,在异步方法里 throw 异常,然后使用 Controller ,控制异步任务的退出,也可以。
另外 现代化运行时框架 认为,用事件做控制流是反模式 是 anti pattern ,会把代码搞得很乱,不可追溯,一般采用 回调 来响应事件,更符合函数式编程
这样可以过面试吗?
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。