typescript - 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)
推荐阅读
- php - 导入 50k 记录文件
- javascript - 使用Javascript编写一个比较两棵树的函数,如果它们在结构和值上相等则返回true,如果不相等则返回false
- javascript - 如何在 JavaScript 中忽略“iframe”的“权限被拒绝”错误
- javascript - 如何查找和更新关键数据?
- docker - 推送到 ContainerRegistry 时访问被拒绝
- php - 无法使用 PHP 和 UTF-8 在 Windows 中创建目录
- ruby-on-rails - RAILS APP : heroku[router]: at=error code=H10 desc="App crashed"
- c# - ASP.NET 核心模型验证无法按预期工作
- powershell - 如何在 RegDB 中检索/查询 COM+ 应用程序属性的值
- sphinx4 - sphinx4 在树莓派中无法正常工作(没有可用的 microfon)