我构建了一个 CoffeeScript 类来解决这个问题。它类似于@Valent,但功能更全面,所以我想我会分享它。它为 Web 套接字事件提供"on"
、"off"
和"clear"
方法,还为 和 提供转发功能"send"
,"close"
因此您几乎不必直接接触套接字。如果您确实需要访问实际的 WebSocket 对象,您可以通过superWebSocket.ws
.
编辑:我添加了一个getConnection
静态方法来生成依赖于 url 的单例。这样,每个网址只有一个连接,如果您尝试创建第二个连接,它只会为您提供现有的连接。它还可以防止任何人直接调用构造函数。
编辑:我通过 JSON 中的套接字进行通信。我添加了一些代码,这些代码将JSON.stringify
在传入的任何非字符串上运行,send
并且还将尝试JSON.parse
在通过处理程序接收到的任何消息上运行。
superSockets = {}
class SuperWebSocket
@getConnection: (url)->
superSockets[url] ?= new SuperWebSocket url
superSockets[url]
constructor: (url)->
if arguments.callee.caller != SuperWebSocket.getConnection
throw new Error "Calling the SuperWebSocket constructor directly is not allowed. Use SuperWebSocket.getConnection(url)"
@ws = new WebSocket url
events = ['open', 'close', 'message', 'error']
@handlers = {}
events.forEach (event)=>
@handlers[event] = []
@ws["on#{event}"] = (message)=>
if message?
try
message = JSON.parse message.data
catch error
for handler in @handlers[event]
handler message
null
on: (event, handler)=>
@handlers[event] ?= []
@handlers[event].push handler
this
off: (event, handler)=>
handlerIndex = @handlers[event].indexOf handler
if handlerIndex != -1
@handlers[event].splice handlerIndex, 1
this
clear: (event)=>
@handlers[event] = []
this
send: (message)=>
if typeof(message) != 'string'
message = JSON.stringify message
@ws.send message
close: => @ws.close()