likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 19

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

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

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

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

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

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

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

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

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

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

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

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

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

// 偏函数
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

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

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

// 偏函数
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;
};

在项目中的实现可如图:

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

🌊总结:

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