我目前正在編寫nodejs中的遊戲引擎。Nodejs測試。如何避免競爭條件?
我的遊戲有幾個州。我們稱它們爲StateA,StateB,StateC。序列流程是StateA => StateB => StateC。
我想在每個狀態結束時測試我的引擎狀態。我現在有這樣的結構:
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進行評估的狀態。
我試圖在狀態之間注入延遲時間,但是,這會在我的代碼庫中引入額外的競爭條件錯誤。
有人可以請賜教我一個更好的方法來解決這個問題嗎?