2016-10-04 4 views
0

Ich habe Nate Strausers State Machine (https://github.com/nate-strauser/meteor-statemachine) implementiert. Ich bekomme die FSM, um ihren Status erfolgreich in der Datenbank zu speichern, aber ich verfolge mehrere Instanzen. In meinem Beispiel verfolge ich den Schichtstatus von Arbeitern.Meteor State Machine

Ich möchte, dass das System beim Start des Meteors jeweils Zustände lädt. Dann möchte ich eine Zustandsänderungsanforderung für die Zustandsautomateninstanz machen und sie den Status des DB-Dokuments aktualisieren lassen (wenn diese Änderung erlaubt ist).

Wie heirate ich FSM-Instanzen zu den tatsächlichen Shift-Instanzen? Komme ich dem in die falsche Richtung? Irgendwelche Gedanken geschätzt.

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'}) 

}); 

Antwort

0

Es gibt eine Änderung in einer Gabel des ursprünglichen Zustandsmaschine, die eine transitionTo Methode fügt, so dass jeder Staat gewählt werden - was ich denke, ist das, was Sie aus der Datenbank in die Wiederherstellung des Staates wollen. Ich habe eine Gabel, die ein paar anderen Völker konsolidiert ändert

Sie könnten natestrauser Paket lokal in Ihrem Projekt klonen meinen Repo zu beziehen (obwohl ich keinen Release es getan haben). Ich beabsichtige, eine Pull-Anfrage zu machen, sobald meine Änderungen stabil sind (was sie zu sein scheinen).

Verwandte Themen