NGXS - Как упаковать и действовать так, чтобы его можно было отправить удаленно - PullRequest
0 голосов
/ 08 апреля 2020

Я недавно искал одноранговый обмен сообщениями для многопользовательского приложения. Для этого у меня появилась идея отправлять действия от одного клиента другому.

Можно ли сериализовать действие?

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

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

1 Ответ

0 голосов
/ 10 апреля 2020

Итак, я сделал действие, которое выполняет другие действия и упаковывает их:

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

Это примет действие в качестве аргумента, извлечет его строку типа и данные и сохранит его в мета-действии в сочетании с упакованным действием. Атрибут.

В состоянии вы можете добавить обработчик, который отправляет упакованное действие через некоторое соединение:

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

Наконец, на приемнике вы можете просто отправить переданное действие:

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

Чтобы отправить действие клиенту, можно просто сделать:

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