我目前正在玩coffeescript
和使用nodejs
的websockets
我创建了一个class SocketHandler
来管理websocket客户端:
class SocketHandler
constructor: (@server) ->
@server.on "connection", @onClientConnect
onClientConnect: (socket) ->
console.log "client connected"
socket.on "close", @onClientDisconnect
onClientDisconnect: (code, message) ->
console.log "client disconnected"
ws = require "ws"
server = ws.Server { port: 8080 }
sockethandler = new SocketHandler server
当我运行脚本并且客户端连接时,我收到以下错误消息:
client connected
events.js:210
throw new TypeError('listener must be a function');
^
TypeError: listener must be a function
[...]
我不知道为什么会这样。在我看来,我将函数引用传递给socket.on
作为第二个参数。
我尝试进一步调查并尝试输出onClientDisconnect
以查看它的类型
所以我改变了
onClientConnect: (socket) ->
console.log "client connected"
socket.on "close", @onClientDisconnect
到
onClientConnect: (socket) ->
console.log "client connected"
console.log @onClientDisconnect
socket.on "close", @onClientDisconnect
导致获得undefined
值作为输出。
现在我真的很困惑,我认为我缺少一些基本的语言工作方式 你们中的任何人都可以帮助我吗?
答案 0 :(得分:1)
提醒:@onClientConnect
是this.onClientConnect
的简写。 this
正是这里的问题。函数调用的上下文(函数内部this
)是在Javascript中的调用时确定的。当你传递一个函数时,接收者会在没有上下文的情况下接收它,当这样调用时,this
将不会引用你正在思考/想要/期望的this
。
长话短说:您需要将this
绑定到您的函数,因此@
中的@onClientDisconnect
实际上是指您的类实例:
@server.on "connection", @onClientConnect.bind @
CoffeeScript中的替代方法(使用上下文绑定的胖箭头回调):
@server.on "connection", => @onClientConnect()
另见How to access the correct `this` context inside a callback?