注册
web

qq农场私信我,您菜死了🥬

最近在写代码的时候发现自己总是有这样几种症状



  1. 脸红心跳,像发烧一样😳;
  2. 口干舌燥、咳嗽不停😮‍💨;
  3. 脑袋放空,像刚通宵了一般👀;
  4. ......

我逐渐怀疑,自己有没有可能是🐑了,甚至时不时就拿起体温计量一量,拿起自测试纸测一测,这样的情况一直没有得到好转,直到收到QQ农场给我发来这样的一条信息:


尊敬的QQ农场主,您去年和今年菜死了!🥬🥬🥬


🤔于是,我开始分析我症状根因是什么:



  1. 脸红心跳:是因为自己脑海中想象好的实现方案,但实际却写不出一行代码,或者各种Error,导致我心里落差很大,自我怀疑,或者是被人看穿菜的窘迫、害羞?
  2. 口干舌燥:是因为自己陷入了 写不出代码 => 憋着气接着写,不休息喝水 => 写不出代码 这样的闭环🐶里面;
  3. 脑袋放空:摆脱了内耗,很容易得出结论,就是看的技术不够多,写的代码不够多

痛定思痛,决定在这里立下FLAG,要多看多实践,学习和思考好的代码写法,看得多,写得多。


今天分享的主要是:用好发布订阅、偏函数的一对多 & 多对一关系工厂函数


发布订阅 & 偏函数(一对多/多对一关系)


是一种一对多的模式,或者说多对多的模式;一个事件对应多个处理函数,多个事件对应各自对应的处理函数



那假如我们想实现一个多对一的关系呢?我们可以使用偏函数


偏函数个人理解类似工厂函数,利用了闭包的特性


// 偏函数
function after(times, cb) {
let count = 0;
const result = {};
return inner(key, value) => {
result[key] = value;
count++;
if (count === times) {
cb(result);
}
};
}

结合代码看此处相当于多个inner函数对应一个callback函数,由count来控制是否触发callback,这种模式常常用于异步编程,比如Promise.all



综合一对多和多对一模式:


// 偏函数
function after(times, cb) {
let count = 0;
const result = {};
return (key, value) => {
result[key] = value;
count++;
if (count === times) {
cb(result);
}
};
}

// 发布订阅
const emitter = new (require("events").EventEmitter)();
const done = after(3, render);

emitter.on("done", done);
emitter.on("done", other);

fs.readFile(file, (err, template) => {
emitter.emit("done", "template", template);
});

fs.readFile(file, (err, data) => {
emitter.emit("done", "data", data);
});

fs.readFile(file, (err, str) => {
emitter.emit("done", "str", str);
});



工厂函数


类似现实工厂,在代码中用来生产特定结构函数/对象等的函数


比如想实现一个生成校验函数的工厂函数:


/**
* config里可以包含一般的描述性属性,钩子函数等
**/
export function factory(config) {
config.before = config.before || ((d) => d);
// pre钩子
handlersMap[config.type]?.pre(config);

return function (data) {
// before钩子函数
data = config.before(data);
return handlersMap[config.type].check(data);
};
}

// 通过该方法注册不同的校验函数
const handlersMap = {};
factory.registerHandler = function (type, handler) {
handlersMap[type] = handler;
};

在项目中的实现可如图:



🌊总结:


阅读好的代码,并学习一些好的写法,才是比较实际提高代码能力的方式,我也将💪持续阅读好的代码库,思考学习好的代码,把自己的成长分享出来。


作者:Kuroo
来源:juejin.cn/post/7182545613282623549

0 个评论

要回复文章请先登录注册