问题描述
我在这里有一个简单的例子来复制我的问题。我正在尝试创建一种通用的客户端处理程序。当客户端通过 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)