Облачные функции не гарантированно срабатывают по порядку или только один раз.Поэтому вы должны сделать их идемпотентными.
Вы можете решить эту проблему следующим образом:
- Всегда используйте транзакции для обновления состояния, чтобы 2 клиента не пытались изменитьодновременное состояние.
- Создание таблицы состояний, которая управляет состоянием и выполняет функции на основе текущего состояния в сравнении с предыдущим состоянием.
- Клиенты не должны изменять состояние на значениеменьше того, что существует в настоящее время.
states.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"]}
]
app.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
для обработки необходимых команд.