在下面的代码中,我无法弄清楚如何从处理程序(sock)方法中调用parseData(data)方法。
我在其他问题的所有方面都尝试过这个问题:Other question
"use strict";
var net = require('net');
var HOST = '127.0.0.1';
class Sorter {
constructor(sorter) {
this.sorter = sorter;
console.log(sorter.name + ' Port: ' + sorter.port + ' running!');
this.initialize();
}
initialize() {
net.createServer(this.handler).listen(this.sorter.port, HOST);
}
handler(sock) {
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ':' + sock.localPort + ': ' + data);
parseData(data);
// Write the data back to the socket, the client will receive it as data from the server
//sock.write('Hello there'); //response
});
// Add a 'close' event handler to this instance of socket
sock.on('close', function(data) {
console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
});
}
parseData(data) {
// find out if I have a carton with the data recvd
console.log('looking for container: ' + data + ' ...');
console.dir(this.findByContainer(data));
}
findByContainer(container) {
return GLOBAL.CARTONS.filter(function( obj ) {
return +obj.container === +container;
})[0];
}
}
module.exports = Sorter;
答案 0 :(得分:0)
使用this.parseData(data);
。
由于类的实例化,必须引用这个。
查看方法内的其他调用。
答案 1 :(得分:0)
parseData
不在范围内。您需要bind函数,以便在从不同范围调用它们时它们在范围内。
当你致电this.initialize()
时,你有正确的想法;它不是全局函数,因此您需要引用this
。您需要对parseData
执行相同操作。
但是,因为您从回调中呼叫parseData
,this
将不会是您所期望的。您需要绑定回调或在回调之外保存对this
的引用。我更喜欢前者,但这取决于你。
使用bind
:
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ':' + sock.localPort + ': ' + data);
this.parseData(data);
// Write the data back to the socket, the client will receive it as data from the server
//sock.write('Hello there'); //response
}.bind(this));
使用已保存的this
引用:
var _this = this;
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ':' + sock.localPort + ': ' + data);
_this.parseData(data);
// Write the data back to the socket, the client will receive it as data from the server
//sock.write('Hello there'); //response
});
您还可以使用arrow function进行回调。自动为箭头功能维护范围,但您仍需要引用this
来呼叫parseData
。
使用箭头功能:
sock.on('data', data => {
console.log('DATA ' + sock.remoteAddress + ':' + sock.localPort + ': ' + data);
this.parseData(data);
// Write the data back to the socket, the client will receive it as data from the server
//sock.write('Hello there'); //response
});