Javascript 带状态的ifElse语句? 出身背景
我正在制作一个从多个设备接收消息的应用程序。收到消息后,将使用给定消息触发事件:Javascript 带状态的ifElse语句? 出身背景,javascript,sockets,functional-programming,ramda.js,Javascript,Sockets,Functional Programming,Ramda.js,我正在制作一个从多个设备接收消息的应用程序。收到消息后,将使用给定消息触发事件: on( "data", message => { //doSomething } ); 挑战 此函数接收两种类型的消息:A和B: 消息A具有设备的id 消息B包含有关设备的一些信息 我处理这个问题的第一个方法是: const { ifElse } = require("ramda"); const evalData = ifElse( isTypeA, // Return
on( "data", message => {
//doSomething
} );
挑战
此函数接收两种类型的消息:A和B:
- 消息A具有设备的id
- 消息B包含有关设备的一些信息
const { ifElse } = require("ramda");
const evalData = ifElse(
isTypeA, // Returns true if type A, false otherwise
evalTypeA, // Returns device Id
evalTypeB // Processes data in message and returns bytes read
);
on( "data", evalData );
问题
这里的问题是,类型B的消息没有它们所属设备的Id。因此,为了正确处理该消息,我需要在上一条消息中返回的设备ID
我解决这个问题的想法是将Id传递给evalTypeB
:
const evalData = messages => {
let id = undefined;
id = ifElse(
isTypeA, // Returns true if type A, false otherwise
evalTypeA, // Returns device Id
evalTypeB( id ) // Processes data in message and returns bytes read
)( message );
}
这里的问题是这行不通evalTypeB
还返回一个数字,然后我就不知道ifElse
表达式给我的是读取的字节数还是Id
问题
如何在没有变异和副作用的情况下解决这个问题?根据定义,一个纯函数在('data',callback)上被反复调用作为
的回调,它无法跟踪以前调用的状态
考虑到这一点,有两个选项可以考虑,以帮助最小化或定位副作用:
关闭状态,保持逻辑无副作用:
const processMsg=ifElse(isTypeA、evalTypeA、evalTypeB)
常量处理程序=初始状态=>{
让状态=初始状态
返回消息=>{
state=processMsg(state,msg)
}
}
关于('data',handler(42))
递归地附加一个新的处理程序,该处理程序在每次调用结束时只对每条消息调用一次,从而限制对处理程序注册的影响(这假设事件发射器支持类似once
):
const processMsg=ifElse(isTypeA、evalTypeA、evalTypeB)
const handler=state=>msg=>
once('data',handler(processMsg(state,msg)))
一次(“数据”,处理程序(42))
根据定义,在('data',callback)
上作为的回调重复调用的纯函数无法跟踪以前调用的状态
考虑到这一点,有两个选项可以考虑,以帮助最小化或定位副作用:
关闭状态,保持逻辑无副作用:
const processMsg=ifElse(isTypeA、evalTypeA、evalTypeB)
常量处理程序=初始状态=>{
让状态=初始状态
返回消息=>{
state=processMsg(state,msg)
}
}
关于('data',handler(42))
递归地附加一个新的处理程序,该处理程序在每次调用结束时只对每条消息调用一次,从而限制对处理程序注册的影响(这假设事件发射器支持类似once
):
const processMsg=ifElse(isTypeA、evalTypeA、evalTypeB)
const handler=state=>msg=>
once('data',handler(processMsg(state,msg)))
一次(“数据”,处理程序(42))
解决方案2非常明显!我怎么没想到呢?谢谢解决方案2非常明显!我怎么没想到呢?谢谢