效率的JavaScript回调(Efficiency with JavaScript Callbac

2019-09-16 13:01发布

我只是想确认我的怀疑。

我偶然发现在下列方式使用Socket.io其推荐的文章:

var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
    socket.on('action1', function (data) {
        // logic for action1
    });

    socket.on('action2', function (data) {
        // logic for action2
    });

    socket.on('disconnect', function(){
        // logic for disconnect
    });
});

我觉得以下将是一个更好地利用资源:

var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
    socket.on('action1', action1);
    socket.on('action2', action2);
    socket.on('disconnect', disconnect);
});

function action1(data) {
    // logic for action1
}

function action2(data) {
    // logic for action2
}

function disconnect() {
    // logic for disconnect
}

我的感觉是,虽然处理该匿名函数connection的事件在内存中创建只有一次,即处理匿名函数action1action2 ,和disconnect在内存中创建的每一个套接字连接。 与第二种方法的问题是, socket不再在范围内。

所以,首先是我对创作的职能怀疑是真的吗? 其次,如果是的话有没有办法让socket范围为命名的功能呢?

Answer 1:

使用封闭有助于保持清洁范围:

io.sockets.on('connection', function () {
    function action1(data) {
        // logic for action1
    }
    function action2(data) {
        // logic for action2
    }
    function disconnect() {
        // logic for disconnect
    }
    return function (socket) {
        socket.on('action1', action1);
        socket.on('action2', action2);
        socket.on('disconnect', disconnect);
    }
}()); // <- note the immediate function call 

您的问题:

所以,首先是我对创作的职能怀疑是真的吗?

是。 上面的闭合方法防止此,回调函数所创建一次。 加:都看到了正确的父作用域。

其次,如果是的话有没有办法让socket范围为命名的功能呢?

socket将作为this在的回调。



Answer 2:

你是正确的,对于每个连接创建匿名方法 - 如果你不需要的范围,那么第二种方法也避免这种情况。 如果您需要在插座的范围有避免它没有真正的方法。 如果你想保持方法外部(某些其他原因),仍然保持范围,你总是可以:

//...
socket.on('action1', function(){
  action1.apply( socket, arguments );
} );
//... and so forth.

但是,有你回到创建每个连接的方法签名,所以我不知道你会获得什么。



文章来源: Efficiency with JavaScript Callbacks