云功能不能保证按顺序或只发射一次。因此,你必须使它们是等幂的。
您可以通过以下方式解决此问题:
-
始终使用事务更新状态,这样2个客户机就不会同时尝试更改状态。
-
创建一个状态表,用于管理状态,并基于当前状态与前一状态运行函数。
-
客户端不能将状态更改为小于当前存在值的值。
状态.json
[
{"currentState": "state1", "action": "state2", "newStates": ["state2"]},
{"currentState": "state1", "action": "state3", "newStates": ["state2", "state3"]},
{"currentState": "state1", "action": "state4", "newStates": ["state2", "state3", "state4"]},
{"currentState": "state1", "action": "state5", "newStates": ["state2", "state3", "state4", "state5"]},
{"currentState": "state2", "action": "state3", "newStates": ["state3"]},
{"currentState": "state2", "action": "state4", "newStates": ["state3", "state4"]},
{"currentState": "state2", "action": "state5", "newStates": ["state3", "state4", "state5"]},
{"currentState": "state3", "action": "state4", "newStates": ["state4"]},
{"currentState": "state3", "action": "state5", "newStates": ["state4", "state5"]},
{"currentState": "state4", "action": "state5", "newStates": ["state5"]}
]
应用程序JS
function processStates (beforeState, afterState) {
const states = require('../states');
let newStates;
// Check the states and set the new state
try {
newStates = states.filter(function(e) {return e.currentState == beforeState && e.action == afterState;})[0].newStates;
}
catch (err) {
newStates = null;
}
console.log(`newStates: ${newStates}`);
if (newStates) {
newStates.forEach(newState) {
// Process state change here
switch (newState) {
case 'state1': {
// Process state1 change
break;
}
case 'state2': {
// Process state2 change
break;
}
default: {
}
}
}
}
}
一旦您有了一个状态数组,您就可以使用
forEach
或
map
处理所需的命令。