javascript - 将函数引用传递给函数失败

标签 javascript node.js coffeescript

我目前正在使用 nodejs 尝试 coffeescript 和 websockets。
我创建了一个 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

导致输出未定义值。

现在我真的很困惑,我认为我错过了该语言如何工作的一些基本知识。
你们谁能帮帮我吗?

最佳答案

提醒:@onClientConnectthis.onClientConnect 的简写。 this 正是这里的问题。函数调用的上下文(this 在函数内部)是在 Javascript 调用时确定的。当您传递一个函数时,接收者“没有上下文”地接收它,并且当这样调用时,this不会引用您正在思考/想要的this期待。

长话短说:您需要将 this 绑定(bind)到您的函数,因此 @onClientDisconnect 中的 @ 实际上引用您的类实例:

@server.on "connection", @onClientConnect.bind @

CoffeeScript 中的替代方案(使用上下文绑定(bind)的粗箭头回调):

@server.on "connection", => @onClientConnect()

另请参阅How to access the correct `this` context inside a callback?

关于javascript - 将函数引用传递给函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417471/

相关文章:

node.js - 如何使用发布请求向 MLab 添加新用户?

JavaScript 术语 : do I (call/invoke/execute) a function?

javascript - JQuery 的 on() : How do I make JQuery find the selectors from left to right?

javascript - postman 如何发送请求? ajax,同源策略

angularjs - 在 Electron 应用程序中导航 Angular 路线时出现黑屏

javascript - 所有 $watch 执行后的 AngularJS Controller 事件

javascript - Vuex:刷新浏览器时保留部分状态

javascript - 如果回调调用封闭函数,它会被称为递归调用吗?

javascript - 带选项的 Coffeescript 函数

mongodb - Mongoose文档更新错误