我对Nodejs& amp;试图绕过ES6课程&保持封装的东西,但也能够引用类中的函数。
我正在围绕其中一个websockets类编写一个包装器,并尝试将websocket连接函数中定义的函数映射到类中定义的函数。 (参见我解释的init函数)。我明白为什么会失败,但我不知道如何让它在课堂上引用它。
所以问题是:我如何引用或"注入"在类中定义为嵌入式函数(具有不同的上下文)的函数,并且有最佳实践。 注意:在以下方面与How to access the correct this
inside a callback?
不同(或者我需要帮助理解应用程序):
1)它正在使用一个类,所以我们目前无法声明变量,除非我们使用" this.variable = somevalue" (这违背了引用的全部目的"这")。
2)如果我使用箭头功能,如下:
this.socketServer.on('connection', (ws) => {
ws.on('message', () => this.receiveMessage)
ws.send('socket open')
});
*已解决*
const boundReceiveMessage = this.receiveMessage.bind(this)
this.socketServer.on('connection', (ws) => {
ws.on('message', boundReceiveMessage)
ws.send('socket open')
});
当我引用ws.on时(' message' ..,这个范围不是类 - 它是真正的webscocket本身 - 这是有道理的 - 但我无法形象如何在那里引用类定义函数。
我的直觉是我在我的结构中做了一些根本错误的事情 - 事件发射器可能会被错误地实例化。
我感谢您帮助我解决这个问题,如果您能指出我做更好的方法,我们也会感激不尽。
'use strict'
const WebSocket = require('ws')
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
class WebsocketServer{
constructor(){
this.openSocket = openSocket
this.socketServer = {}
this.broadcastMessage = broadcastMessage
this.receiveMessage = receiveMessage
this.init = init
}
}
async function init(){
await this.openSocket()
await this.socketServer.on('connection', function connection(ws) {
//the following line fails because "this" is not the context of the class
ws.on('message', this.receiveMessage)
ws.send('socket open')
})
}
function openSocket(portNumber){
this.socketServer = new WebSocket.Server({ port: portNumber==undefined ? 8080 : portNumber })
}
function broadcastMessage(message){
this.socketServer.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(message)
}
})
}
function receiveMessage(data){
console.log(`Received socket Message: ${data}`)
eventEmitter.emit('dataReceived',data)
}
module.exports = WebsocketServer