传递功能参考功能失败

时间:2016-02-15 19:26:02

标签: javascript node.js coffeescript

我目前正在玩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值作为输出。

现在我真的很困惑,我认为我缺少一些基本的语言工作方式 你们中的任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

提醒:@onClientConnectthis.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?