Nodejstesting。 如何避免竞赛条件?

我目前正在编写一个nodejs的游戏引擎。

我的游戏有几个州。 我们称之为StateA,StateB,StateC。 序列stream程是StateA => StateB => StateC。

我想在每个状态结束时testing我的引擎状态。 我目前有这样的结构:

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

所以我现在的方法是让我的testing用例覆盖stateXCallback并在这些函数中执行testing逻辑。

但是, stateACallBack执行完成之前 ,我看到stateB被触发的争用条件。 因此,stateACallback会看到应该由stateBCallback进行评估的状态。

我试图在状态之间注入延迟时间,但是,这会在我的代码库中引入额外的竞态条件错误。

有人可以请启发我一个更好的方法来解决这个问题?

这样抽象地讨论这个问题是相当困难的,但在我看来,你所称的状态并不是真正的状态,而是asynchronous事件。 每个事件都可能改变状态机的内部状态,但这取决于接收事件的顺序。 我不确定是否事件B的唯一触发器是事件A,但我假设不是。 (如果是这样的话,那么为什么把事件分成单独的事件A,B和C?似乎是任意的和毫无意义的,为什么不直接调用每个callback?)。

所以,为了实现状态机,需要一个variables来跟踪机器当前的状态。当收到一个事件时,callback必须决定是否使用事件并使状态机前进或放入一个队列并等待机器处于不同的状态。

如果你想要更多的细节,或更准确的答案,你将不得不告诉我这些事件是什么以及是什么触发它们。