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));
请注意,我建议在此处过滤操作,因为遥控器可以调度任何定义的操作。
我最近在研究多用户应用程序的点对点消息传递。为此,我想到了将动作从一个客户端发送到另一个客户端。
是否可以序列化一个动作?
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));
请注意,我建议在此处过滤操作,因为遥控器可以调度任何定义的操作。