NGXS - 如何打包一个动作以便可以远程调度

NGXS - How to package an action so that it can be dispatched remotely

我最近在研究多用户应用程序的点对点消息传递。为此,我想到了将动作从​​一个客户端发送到另一个客户端。

是否可以序列化一个动作?

source.connection.send(action); // the type is not in the data?

destination.connection.on("data", data => this.store.dispatch(data)) 

有官方文档,甚至还有解释如何为 websockets 执行此操作的插件。


执行此操作所需的代码非常简单,所以这是我对 web 套接字以外的东西的实现。

export class SendAction {
    static readonly type = '[Connection] SendAction';
    public packedAction: any;
    constructor(action: any) {
        const type: string = action.__proto__.constructor.type;
        this.packedAction = { type: type, ...action };
    }
}

这会将一个动作作为参数,提取它的类型字符串和数据,并将其存储到 packedAction 属性下的元动作中。

在该状态下,您可以添加一个处理程序,通过某个连接发送打包操作:

    @Action(SendAction)
    dispatch(context: StateContext<ConnectionModel>, action: SendAction) {
        this.connection.send(action.packedAction);
    }

最后,您可以在接收器上简单地分派传输的操作:

   connection.on('data', this.store.dispatch);

要向客户端发送操作,只需执行以下操作:

const action = new SomeAction("some payload");
this.store.dispatch(new SendAction(action));

请注意,我建议在此处过滤操作,因为遥控器可以调度任何定义的操作。