当前位置:首页 > JavaScript

js规则链实现

2026-03-16 08:28:46JavaScript

实现 JavaScript 规则链的方法

基于责任链模式的设计

责任链模式允许将多个处理对象串联成链,请求在链上传递直至被处理。以下是实现步骤:

js规则链实现

class Rule {
  constructor(condition, action) {
    this.condition = condition;
    this.action = action;
    this.nextRule = null;
  }

  setNextRule(rule) {
    this.nextRule = rule;
    return rule;
  }

  execute(context) {
    if (this.condition(context)) {
      this.action(context);
    }
    if (this.nextRule) {
      this.nextRule.execute(context);
    }
  }
}

// 使用示例
const rule1 = new Rule(
  (ctx) => ctx.value > 10,
  (ctx) => { ctx.result = '大于10' }
);

const rule2 = new Rule(
  (ctx) => ctx.value <= 10,
  (ctx) => { ctx.result = '小于等于10' }
);

rule1.setNextRule(rule2);
rule1.execute({ value: 5 }); // 输出: { value: 5, result: "小于等于10" }

使用数组实现的轻量级规则链

对于简单场景,可以用数组存储规则并按顺序执行:

js规则链实现

const ruleChain = [
  {
    condition: (ctx) => ctx.user.role === 'admin',
    action: (ctx) => { ctx.access = 'full' }
  },
  {
    condition: (ctx) => ctx.user.role === 'user',
    action: (ctx) => { ctx.access = 'partial' }
  }
];

function executeRules(context) {
  for (const rule of ruleChain) {
    if (rule.condition(context)) {
      rule.action(context);
      break; // 匹配后终止
    }
  }
}

支持异步处理的规则链

使用Promise实现异步规则链:

class AsyncRuleChain {
  constructor() {
    this.rules = [];
  }

  addRule(condition, action) {
    this.rules.push({ condition, action });
  }

  async execute(context) {
    for (const { condition, action } of this.rules) {
      if (await condition(context)) {
        await action(context);
        break;
      }
    }
  }
}

规则引擎库集成

现有库如json-rules-engine提供更完整的解决方案:

const { Engine } = require('json-rules-engine');

const engine = new Engine();
engine.addRule({
  conditions: {
    all: [{
      fact: 'temperature',
      operator: 'greaterThan',
      value: 60
    }]
  },
  event: {
    type: 'alert',
    params: {
      message: '温度过高!'
    }
  }
});

engine.run({ temperature: 70 }).then(events => {
  events.map(event => console.log(event.params.message));
});

关键实现要点

  • 条件与执行分离:每个规则应包含独立的条件判断和执行逻辑
  • 链式管理:明确规则间的传递关系,支持动态添加/移除规则
  • 上下文传递:通过共享上下文对象实现规则间数据传递
  • 终止控制:根据需求决定是否在规则匹配后终止链式执行

性能优化建议

  • 对高频规则进行优先级排序
  • 使用备忘录模式缓存条件计算结果
  • 对于确定性子集可考虑决策树优化

标签: 规则js
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…