#javascript #node.js #drools #rule-engine #json-rules-engine
#javascript #node.js #пускает слюни #rule-engine #json-rules-engine
Вопрос:
Я новичок в движке правил и пытаюсь создать движок правил на javascript.
У меня есть следующее правило и я передаю один параметр в качестве неправильного ввода, как определить, какой аргумент (факт) не соответствует.
Событие выдает сообщение без сбойных правил, интересно, как получить сбойные параметры.
Пожалуйста, дайте мне знать, что делать в этой ситуации.
npm json-rules-engine
Правила:
engine.addRule({
conditions: {
any: [{
all: [{
fact: 'gameDuration',
operator: 'equal',
value: 40
}, {
fact: 'personalFoulCount',
operator: 'greaterThanInclusive',
value: 5
}]
}, {
all: [{
fact: 'gameDuration',
operator: 'equal',
value: 48
}, {
fact: 'personalFoulCount',
operator: 'greaterThanInclusive',
value: 6
}]
}]
},
event: { // define the event to fire when the conditions evaluate truthy
type: 'fouledOut',
params: {
message: 'Player has fouled out!'
}
}
})
**input:**
`let facts = {
personalFoulCount: 6,
gameDuration: 102
}`
**output:**
Player has fouled out!
**expected output:**
Player has fouled out due to a mismatch in gameDuration
Ответ №1:
Недавно я использовал этот модуль npm: json-rules-engine попал в ту же ситуацию и нашел решение это может быть точным решением или нет, но служит цели
Решение: определите несколько объектов правил и передайте в движок и получите сбойные правила.
Подробные сведения: 1. Из приведенного выше примера, в условиях.в любом массиве есть 2 объекта 2. создайте 2 объекта правил с именем правила, как показано ниже const createRule = (условия, имя правила) => ({ условия, событие: {тип: имя правила}, }); 3. создайте объект движка, передав массив правил постоянный движок = новый движок (список правил); 4. как только факты в движке противоречат правилам, сбойные правила могут быть выведены следующим образом: то есть engine.run(факты).then(результаты => { // результаты.события будут проходить по правилам // чтобы получить сбойные правила: ведите список имен правил и фильтруйте переданные правила });
Ответ №2:
Мы можем использовать on
метод для получения failure/success
события правила. Приведенный ниже пример возвращает количество успешных и неудачных правил.
let facts = [{
personalFoulCount: 6,
gameDuration: 102
},
{
personalFoulCount: 6,
gameDuration: 40
}]
engine.addRule({
conditions: {
all: [{
fact: 'gameDuration',
operator: 'equal',
value: 40
}]
},
event: { type: 'procedure_result'}
})
let result = {success_count : 0 , failed_count : 0}
engine.on('success', () => result.success_count )
.on('failure', () => result.failed_count )
const getResults = function(){
return new Promise((resolve, reject) => {
facts.forEach(fact => {
return engine.run(fact)
.then(() => resolve())
})
})
}
getResults().then(() => console.log(result));
Вывод: { success_count: 1, failed_count: 1 }