首页 > 解决方案 > 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);

标签: typescripteffector

解决方案


我没有抓住你问题的背景,但我会试一试。您可以询问其他问题

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)

推荐阅读