【发布时间】:2019-01-29 18:32:05
【问题描述】:
我有一个关于有状态流的问题,我将尝试将其分解为一个非常简单的示例:
我正在使用不同的状态,比如说原始、添加和计算。
我的状态由一个我想添加的 int 组成,在我添加两次之后,我想计算加倍的数量,然后再次将其设置为原始状态。
所以现在我将从一个原始流开始,int = 0。在我的转换中,我对 addNumber 事件做出反应,从事件数据中取出一个 int 并将其添加到我的状态,然后我 transitionTo('add')。
我重复一遍,添加另一个号码和transitionTo('calculate')。
在我的反应中,我现在对添加和计算之间的转换做出反应,并将新状态设置为整数的两倍。
我现在要做的是使用该数字,例如发送包含它的命令,然后重置状态和transitionTo('pristine')。
问题是:我不能设置状态,也不能转换。
你如何解决这个问题?
这里有实际的代码,这样更容易理解:
'use strict';
const identity = {
'usermgmt.user.presentSwitched': event => event.user.id,
'usermgmt.user.pauseSwitched': event => event.user.id
};
const initialState = {
is: 'pristine',
present: false,
pause: false,
presentSince: null,
presentUntil: null,
pauses: [],
};
const transitions = {
pristine: {
'usermgmt.user.presentSwitched' (flow, event) {
flow.setState({
present: true,
presentSince: event.data.timestamp
});
flow.transitionTo('present');
}
},
present: {
'usermgmt.user.presentSwitched' (flow, event) {
flow.setState({
present: false,
presentUntil: event.data.timestamp
});
flow.transitionTo('calculating');
},
'usermgmt.user.pauseSwitched' (flow, event) {
const newPause = {pauseSince: event.data.timestamp};
flow.setState({
pause: true,
pauses: [...flow.state.pauses, newPause]
});
flow.transitionTo('pause');
}
},
pause: {
'usermgmt.user.pauseSwitched' (flow, event) {
const pauses = Object.create(flow.state.pauses);
pauses[flow.state.pauses.length - 1].pauseUntil = event.data.timestamp;
flow.setState({
pause: false,
pauseSince: event.data.timestamp,
pauses
});
flow.transitionTo('present');
}
}
};
const reactions = {
present: {
'calculating' (flow, event, services) {
const {app, logger} = services;
const workDayId = 'kek';
const from = flow.state.presentSince;
const to = flow.state.presentUntil;
const pauses = flow.state.pauses;
logger.info(JSON.stringify(flow));
app.keksing.recording().createRecording({workDayId, from, to, type: 'working'});
flow.setState({
present: false,
pause: false,
presentSince: null,
presentUntil: null,
pauses: [],
});
flow.transitionTo('pristine');
}
}
};
module.exports = { identity, initialState, transitions, reactions };
https://gist.github.com/DrFelder/122a72ffed3eb239a1a3ae33c99ea00d
【问题讨论】:
标签: wolkenkit