Javascript 焊剂和网片

Javascript 焊剂和网片,javascript,websocket,reactjs,flux,Javascript,Websocket,Reactjs,Flux,我在Reactjs应用程序中使用了Flux和WebSocket,在实现过程中遇到了一些问题 问题: 假设我有一组actioncreator和一个用于管理WebSocket连接的存储区,并且连接是在actioncreator(open(token))中启动的,我应该将我的conn.emit放在哪里?我如何让其他操作访问我的连接对象,以便它们可以将数据发送到后端 我是否必须将其作为参数传递给视图中调用的操作(例如,TodoActions.create(conn,todo)),还是有更智能的方法

我在Reactjs应用程序中使用了Flux和WebSocket,在实现过程中遇到了一些问题

问题:

  • 假设我有一组actioncreator和一个用于管理WebSocket连接的存储区,并且连接是在actioncreator(
    open(token)
    )中启动的,我应该将我的
    conn.emit
    放在哪里?我如何让其他操作访问我的连接对象,以便它们可以将数据发送到后端

  • 我是否必须将其作为参数传递给视图中调用的操作(例如,
    TodoActions.create(conn,todo)
    ),还是有更智能的方法

我正在使用ES6课程

如果我遗漏了要点中任何必要的内容,请告诉我

编辑:

这是我根据格洛托的回答编造出来的:

import { WS_URL } from "./constants/ws";
import WSActions from "./actions/ws";

class WSClient {
    constructor() {
        this.conn = null;
    }

    open(token) {
        this.conn = new WebSocket(WS_URL + "?access_token=" + token);
        this.conn.onopen = WSActions.onOpen;
        this.conn.onclose = WSActions.onClose;
        this.conn.onerror = WSActions.onError;

        this.conn.addEventListener("action", (payload) => {
            WSActions.onAction(payload);
        });

    }

    close() {
        this.conn.close();
    }

    send(msg) {
        return this.conn.send(msg);
    }
}

export default new WSClient();

您应该有一个单例模块(不是存储或操作创建者),用于打开套接字并引导通信。然后,任何需要通过套接字发送/接收数据的操作创建者只需要模块并使用其通用方法

下面是一个快速而肮脏的未经测试的示例(假设您使用的是CommonJS):

SocketUtils.js:

var SocketActions = require('../actions/SocketActions.js');

var socket = new WebSocket(...);

// your stores will be listening for these dispatches
socket.onmessage = SocketActions.onMessage;
socket.onerror   = SocketActions.onError;

module.exports = {
  send: function(msg) {
    return socket.send(msg);
  }
};
MyActionCreator.js

var SocketUtils = require('../lib/SocketUtils.js');

var MyActionCreator = {
  onSendStuff: function(msg) {
    SocketUtils.send(msg);
    // maybe dispatch something here, though the incoming data dispatch will come via SocketActions.onMessage
  }
};

当然,在现实中,你会做得更好,做得也不一样,但这让你感觉到你可能会如何构造它。

你能展示/概述我如何创建这样一个单例吗?如果我使用ES6类,我是否应该在构造函数中放入
socket=new WebSocket…
,然后只导出实例化的类。到目前为止,我已经用我的代码更新了我的问题,如果它对其他人有用,并且如果我做错了什么,可以收到反馈。是的,理论上看起来不错!如果不行,请告诉我,我会帮你的。