为什么我不能从同一个类中的另一个方法调用此方法?

时间:2015-12-07 18:07:24

标签: javascript

在下面的代码中,我无法弄清楚如何从处理程序(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;

2 个答案:

答案 0 :(得分:0)

使用this.parseData(data);。  由于类的实例化,必须引用这个。 查看方法内的其他调用。

答案 1 :(得分:0)

parseData不在范围内。您需要bind函数,以便在从不同范围调用它们时它们在范围内。

当你致电this.initialize()时,你有正确的想法;它不是全局函数,因此您需要引用this。您需要对parseData执行相同操作。

但是,因为您从回调中呼叫parseDatathis将不会是您所期望的。您需要绑定回调或在回调之外保存对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
});