Конечный автомат Meteor

#javascript #meteor #state-machine

#javascript #meteor #конечный автомат

Вопрос:

Я реализовал конечный автомат Нейта Страузера (https://github.com/nate-strauser/meteor-statemachine ). Я получаю FSM для успешного сохранения его состояния в БД, но я отслеживаю несколько экземпляров. В моем примере я отслеживаю статус смены рабочих.

Я хочу, чтобы система загружала состояния для каждого при запуске meteor. Затем я хочу сделать запрос на изменение состояния для экземпляра конечного автомата и обновить статус документа БД (если это изменение разрешено).

Как мне связать экземпляры FSM с фактическими экземплярами Shift? Я неправильно подхожу к этому? Любые мысли приветствуются.

 Meteor.startup(function () {

var machineEvents = [
    { name: 'toggleduty',  from: 'Off_Duty',      to: 'On_Duty_Idle' },
    { name: 'toggleduty',  from: 'On_Duty_Idle',  to: 'Off_Duty' },
    { name: 'toggleduty',  from: 'On_Duty_Busy',  to: 'Off_Duty_Busy' },
    { name: 'toggleduty',  from: 'Off_Duty_Busy', to: 'On_Duty_Busy' },
    { name: 'togglebusy',  from: 'On_Duty_Idle',  to: 'On_Duty_Busy' },
    { name: 'togglebusy',  from: 'On_Duty_Busy',  to: 'On_Duty_Idle' },
    { name: 'togglebusy',  from: 'Off_Duty_Busy', to: 'Off_Duty' },
    { name: 'start',       from: 'Init',          to: 'On_Duty_Idle' },];

var machineCallbacks = {
    ontoggleduty: function(event, from, to, shift) {
        console.log('Toggling Duty', shift);
        Shifts.update(shift._id, {$set: { 'status':to }});
    },
    ontogglebusy: function(event, from, to, shift) {
        console.log('Toggling Busy', shift);
        Shifts.update(shift._id, {$set: { 'status':to }});
    },
};


var makeStateMachine = function(shift){
    console.log('new state machine generating');
    var stateMachine = StateMachine.create({
        initial: shift.status,
        events: machineEvents,
        callbacks: machineCallbacks
    });
    switch (shift.state) {
        case "Init":
            console.log('Init to On_Duty_Idle',shift);
            stateMachine.start(shift);
            break;
    }
};

// function killStateMachine(shift){  // not sure how to kill the specific reference
//     stateMachine = null;
// }

//look for new state machines
Shifts.find({'status': 'Init'}).observe({
    added: makeStateMachine,
    //removed: killStateMachine
});

// In the mongo shell I trigger with db.statemachines.insert({_id:'driver1', state:'start'})

});
  

Ответ №1:

В форке исходного конечного автомата есть изменение, которое добавляет метод transitionTo, позволяющий выбирать любое состояние — я думаю, это то, что вы хотите при восстановлении состояния из базы данных. У меня есть форк, который объединяет несколько изменений других пользователей

https://github.com/mikkelking/javascript-state-machine

Вы можете клонировать пакет natestrauser локально в своем проекте, чтобы ссылаться на мой репозиторий (хотя я еще не выпустил его). Я намереваюсь выполнить запрос на извлечение в какой-то момент, как только мои изменения станут стабильными (какими они кажутся).