当前位置:首页 > JavaScript

js规则链实现

2026-03-16 08:28:46JavaScript

实现 JavaScript 规则链的方法

基于责任链模式的设计

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

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" }

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

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

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提供更完整的解决方案:

js规则链实现

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 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…