Javascript 未能执行';发送';在';WebSocket';

Javascript 未能执行';发送';在';WebSocket';,javascript,Javascript,我是javascript新手,希望使用WebSocket。当我创建Websocket对象并尝试发送时,出现以下错误: InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state. 所以我用下面的闭包解决了这个问题。这是解决我问题的合理方法吗?有更好的方法吗?我的方法的一个问题是,如果以后有人重新分配ws.onopen的值。我正在使用redux,因此在向后端发送请求时,我希望使用sen

我是javascript新手,希望使用WebSocket。当我创建Websocket对象并尝试发送时,出现以下错误:

InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.
所以我用下面的闭包解决了这个问题。这是解决我问题的合理方法吗?有更好的方法吗?我的方法的一个问题是,如果以后有人重新分配
ws.onopen
的值。我正在使用redux,因此在向后端发送请求时,我希望使用send。我也在使用ES6、webpack和node.js

const ws = new WebSocket("ws://echo.websocket.org/");
ws.onmessage = msg => console.log(msg);

const send = (()=>{

    const queue = [];
    ws.onopen = () => queue.forEach(msg => ws.send(msg));

    return (msg) => {
        if(ws.readyState === ws.OPEN){
            ws.send(msg);
        }
        else{
            queue.push(msg);
        }
    };

})();

send("foo");
send("bar");

你看过MDN上的吗?我认为您的
InvalidStateError
是因为您最初没有使用
onopen
事件处理程序?@Simon Hänisch是的,我的解决方案基于此。我认为您的
(msg)
参数在错误的函数中。如果将它传递给
send()
,它实际上会传递给返回的函数,而不是自调用匿名函数。它应该是
constsend=(()=>{/…
return(msg)=>{/…
,对吗?关于您关于重新分配
ws.onopen
的问题,您可以使用
ws
对象来防止这种情况发生。@Simon Hänisch感谢您的反馈。我已修复了我的问题以反映您的评论。您是否从MDN查看了?我认为您的
InvalidStateError
是因为您没有使用首先是
onopen
事件处理程序?@Simon Hänisch是的,我的解决方案基于此。我认为
(msg)
参数在错误的函数中。如果将它传递给
send()
,它实际上会传递给返回的函数,而不是自调用匿名函数。它应该是
const send=(()=>{/…
return(msg)=>{/…
,对吗?关于您关于
ws.onopen
被重新分配的问题,您可以使用您的
ws
对象来防止这种情况。@Simon Hänisch感谢您的反馈。我已修复了我的问题以反映您的评论。