在setTimeout中回调后使用“this”时nodejs / js很奇怪

时间:2015-04-14 12:32:50

标签: javascript node.js

这很奇怪。我有代码:

var client = {

    init: function () {
        this.connect();
        return this;
    },

    connect: function () {
        var clientObj = this;

        this.socket = net.connect({
            port: config.port,
            host: config.host
        }, function () {
            log_ts('Connected to serv');
        });

        this.socket.on('data', this.dataParser);

        this.socket.on('end', function () {
            logerr_ts('Disconnected from serv');
            logerr_ts('Trying to reconnect after '+config.reconnectTimeout + 'ms');
            setTimeout(clientObj.connect, config.reconnectTimeout);
        });
    },

    dataParser: function (data) { 
         //analyzing data from me6d server
    }
};

现在当它从serv中被取消时,它正在尝试重新连接,我收到了这个错误:

2015-04-12 15:22:12  Trying to reconnect after 500ms
events.js:142
    throw TypeError('listener must be a function');
          ^
TypeError: listener must be a function
    at TypeError (native)
    at Socket.addListener (events.js:142:11)
    at Socket.Readable.on (_stream_readable.js:671:33)
    at me6dClient.connect [as _onTimeout] (/var/www/nodejs/client/index.js:212:15)
    at Timer.listOnTimeout (timers.js:110:15)

它怎么样? this.dataParser是一个函数。当超时被触发时,可能是它的某些想法变得糟糕,它改变了这个的上下文?但是如何?)

1 个答案:

答案 0 :(得分:3)

问题是使用clientObj.connect作为参考将失去它所绑定的上下文。

您可以像这样重新绑定它:

setTimeout(clientObj.connect.bind(clientObj), ...);

这基本上意味着“达到超时时,使用clientObj.connect作为clientObj致电this

FWIW,这里也是如此:

this.socket.on('data', this.dataParser)

如果没有正确的上下文,也会调用dataParser方法。这个问题(如果实际上 是一个问题)可以用类似的方式解决。