Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带状态的ifElse语句? 出身背景_Javascript_Sockets_Functional Programming_Ramda.js - Fatal编程技术网

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非常明显!我怎么没想到呢?谢谢