返回介绍

Node.js Essential Patterns

发布于 2025-01-25 22:50:09 字数 2035 浏览 0 评论 0 收藏 0

回调模式

回调模式分为异步 CPS 风格和同步 CPS 风格、原生 JS 也可以实现回调模式

function add(a, b) {
  return a + b;
}

改为 CPS 风格:

function add(a, b, callback) {
  callback(a + b);
}

异步 CPS:

function additionAsync(a, b, callback) {
 setTimeout(() => callback(a + b), 100);
}

Zalgo

解决方案:

  • 使用同步 API
  • 延时处理

Node.js 的惯用风格

  • 错误处理总在最前
  • 错误传播
  • 某些异常不太好捕获

模块系统及其模式

  • 模块缓存原理
const require = (moduleName) => {
  console.log(`Require invoked for module: ${moduleName}`);
  const id = require.resolve(moduleName);
  // 是否命中缓存
  if (require.cache[id]) {
    return require.cache[id].exports;
  }
  // 定义 module
  const module = {
    exports: {},
    id: id
  };
  // 新模块引入,存入缓存
  require.cache[id] = module;
  // 加载模块
  loadModule(id, module, require);
  // 返回导出的变量
  return module.exports;
};
require.cache = {};
require.resolve = (moduleName) => {
  /* 通过模块名作为参数 resolve 一个完整的模块 */
};
  • 模块循环依赖
  • 模块寻找的算法

观察者模式

  • EventEmitter 类 如何让任意对象可观察,拓展 EventEmitter 类:
const EventEmitter = require('events').EventEmitter;
const fs = require('fs');
class FindPattern extends EventEmitter {
  constructor(regex) {
    super();
    this.regex = regex;
    this.files = [];
  }
  addFile(file) {
    this.files.push(file);
    return this;
  }
  find() {
    this.files.forEach(file => {
      fs.readFile(file, 'utf8', (err, content) => {
        if (err) {
          return this.emit('error', err);
        }
        this.emit('fileread', file);
        let match = null;
        if (match = content.match(this.regex)) {
          match.forEach(elem => this.emit('found', file, elem));
        }
      });
    });
    return this;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文