Effect 应该返回 Event 吗?

问题描述

在这里一个简单的例子来复制我的问题。我正在尝试创建一种通用的客户端处理程序。当客户端通过 TCP 服务器连接时,我调用 clientFx 效果来创建客户端实例。

假设我将拥有不同的 TCP 服务器,它们都有共同的 clientFx,但处理传入数据的方式不同。这就是为什么我有 handleData 函数,它返回 2 个事件,输入事件 onData 和输出事件 onPayload,它返回解析的有效负载

我在 client.done.watch 函数中结束这里,因为我觉得在 watch 中定义处理数据流不是正确的方法

这是好的方法还是我完全错了?

import * as net from 'net';
import { createDomain,createEffect,forward } from "effector";

function handleData() {
    const domain = createDomain();

    const onData = domain.createEvent();
    const onPayload = domain.createEvent();

    const $store = domain.createStore<number>(0);
    $store.on(onData,x => x + 1);

    forward({ from: $store,to: onPayload });

    return {
        onData,onPayload
    };
}

const clientFx = createEffect((socket: net.socket) => {
    const { onData,onPayload } = handleData();

    socket.on('data',onData);

    return {
        clientId: Math.floor(Math.random() * 100),onPayload
    }
});

clientFx.done.watch(({ result: client }) => {
    client.onPayload.watch((state) => {
        console.log('Store',client.clientId,'changed to',state);
    });

    forward({ from: client.onPayload,to: savetoDbFx });
});

net.createServer(clientFx).listen(5555);

解决方法

我没有理解您问题的上下文,但我会尝试一下。您可以提出其他问题

const $clientsMap = createStore({})
const saveToDbFx = createEffect()
$clientsMap.on(saveToDbFx.done,(clients,({ params })) => {
    return {
        ...clients,[params.id]: params
    }
})
function createClient(socket: net.Socket) {
    const onMessage = createEvent()
    socket.on('data',onMessage)
    split({
        source: onMessage,match: {
            firstSocketType: firstSocketTypeFilterFn,secondSocketType: secondSocketTypeFilterFn
        },cases: {
            firstSocketType: saveToDbFx.prepend(firstDataHandlerFn),secondSocketType: saveToDbFx.prepend(secondDataHandlerFn),})
}
saveToDbFx.watch(console.log)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...