2016-10-04 94 views
0

我已經實現了Nate Strauser的狀態機(https://github.com/nate-strauser/meteor-statemachine)。我讓FSM成功將其狀態保存到數據庫,但我正在跟蹤多個實例。在我的例子中,我正在跟蹤工人的轉變狀態。流星狀態機

我希望系統爲每個流星啓動加載狀態。然後,我想在狀態機實例上進行狀態更改請求,並讓它更新數據庫文檔的狀態(如果允許更改)。

如何將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'}) 

}); 

回答

0

有一個在原始狀態機的一個分支,增加了一個transitionTo方法,從而可以選擇任何狀態的改變 - 我想這是你從數據庫中恢復狀態,想要什麼。我有整合一些其他民族叉子改變

您可以在本地克隆natestrauser的包在你的項目是指我的回購協議(雖然我沒有做過它的釋放)。一旦我的變化穩定下來(他們似乎是這樣),我打算在某個時候進行拉取請求。