ES6课程 - 理解封闭和&接线功能

时间:2018-03-15 05:05:20

标签: node.js

我对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

0 个答案:

没有答案