我在后端使用Ruby gems sinatra
和sinatra-websocket
,在前端使用JS。
我的后端:
get '/' do
if(!(request.websocket?))
erb :index
else
request.websocket do |ws|
ws.onopen do
settings.sockets << ws
end
ws.onmessage do |msg|
EM.next_tick {
settings.sockets.each{|s|
# p s
s.send(msg)
}
}
end
ws.onclose do
warn("connection closed")
end
end
end
end
在前端......
window.onload = function(){
function someFunction(){
var ws = new WebSocket('ws://'+window.location.host+window.location.pathname);
ws.onopen = function(){
var buttons = document.getElementsByClassName('buttons');
[].forEach.call(
buttons,
function(btn){
if(btn!=null){
btn.onclick = function(){
var amt = 11;
ws.send(amt);
console.log(amt);
return false;
};
}
}
);
};
ws.onmessage = function(msg){
console.log(msg);
return false;
};
ws.onclose = function(){
console.log("Connection closed");
return false;
};
}
};
第一个console.log()
打印test
一次,但onmessage
中的一个首先给出响应两次,第二次点击buttons
之一时的三次,每次我点击后都会多次。
这是为什么?如何使onmessage
中的函数每次点击msg
之一时{1}}只给我一次?