我目前正在nodejs中编写游戏引擎。
我的游戏有几个州。我们称之为StateA,StateB,StateC。序列流是StateA => StateB =>卢森堡统计局。
我想在每个州结束时测试我的引擎的状态。我目前有这种结构:
function attachEventListeners = function(instance) {
instance.on('START_STATE_A', stateA);
instance.on('START_STATE_B', stateB);
instance.on('START_STATE_C', stateC);
}
var stateACallBack = function() {};
var stateBCallBack = function() {};
var stateCCallBack = function() {};
function stateA() {
// Do something...
stateACallBack();
setTimeout(function() { this.emit('START_STATE_B'); }, 3000)
}
function stateB() {
// Do something...
stateBCallBack();
setTimeout(function() { this.emit('START_STATE_C'); }, 3000)
}
function stateC() {
// Do something...
stateCCallBack();
setTimeout(function() { this.emit('START_STATE_A'); }, 3000)
}
所以我当前的方法是让我的测试用例覆盖stateXCallback并在这些函数中执行测试逻辑。
但是,我看到一个竞争条件,其中stateB在 stateACallBack完成执行之前被解雇。因此,stateACallback会看到应该由stateBCallback评估的状态。
我尝试在状态之间注入延迟时间,但是,这会在我的代码库中引入额外的竞争条件错误。
有人可以请教我更好地解决这个问题吗?
答案 0 :(得分:1)
以这种抽象的方式讨论这个很难,但在我看来,你所谓的状态并不是真正的状态,它们是异步事件。这些事件中的每一个都可能会更改状态机的内部状态,但这取决于接收事件的顺序。我不确定事件B的唯一触发器是事件A,但我假设没有。 (如果是,那么为什么要将事件分成单独的事件A,B和C?看似任意且毫无意义,为什么不依次调用每个回调?)。
因此,要实现状态机,您需要一个跟踪机器当前状态的变量。当收到事件时,回调必须决定是否使用事件并推进状态机,或者将它放入队列并等待机器处于不同的状态。
如果您想要更多详细信息或更准确的答案,您将不得不告诉我这些事件是什么以及触发它们的原因。