在 socket.io 上添加事件侦听器以节省资源的最佳方式
Best way to add an event listener on socket.io to save resources
所以我想知道 javascript 如何处理函数。
如果我有这样的代码:
io.on("connection", function(socket) {
socket.on("hi", function(data) {
socket.emit("emit", "hey")
})
})
在我看来,每个新连接 javascript 都会为“hi”事件创建另一个函数。所以我目前在我的应用程序中做的是这样的:
function hi(data) {
this.emit("emit", "hey")
}
io.on("connection", function(socket) {
socket.on("hi", hi)
})
这样 javascript 只会重用函数 hi 而不是实例化一个新函数??我不确定这是否有必要,但我想尽可能地消耗更少的资源,因为我正在考虑当服务器有数千个连接时会发生什么。
JavaScript 中的函数被视为对象,因此它们属于引用类型。我们可以通过像这样做一个简单的测试来判断:
const a = () => {};
const b = () => {};
const c = a;
console.log(a === b); // false
console.log(a === c); // true
无论何时在您的案例中创建新连接,都会将函数的引用作为回调传递,这意味着每个连接都将调用函数最初存储的同一内存地址。所以你的实现是正确的,你不必担心在这种情况下使用大量内存的可能性:-)
所以我想知道 javascript 如何处理函数。
如果我有这样的代码:
io.on("connection", function(socket) {
socket.on("hi", function(data) {
socket.emit("emit", "hey")
})
})
在我看来,每个新连接 javascript 都会为“hi”事件创建另一个函数。所以我目前在我的应用程序中做的是这样的:
function hi(data) {
this.emit("emit", "hey")
}
io.on("connection", function(socket) {
socket.on("hi", hi)
})
这样 javascript 只会重用函数 hi 而不是实例化一个新函数??我不确定这是否有必要,但我想尽可能地消耗更少的资源,因为我正在考虑当服务器有数千个连接时会发生什么。
JavaScript 中的函数被视为对象,因此它们属于引用类型。我们可以通过像这样做一个简单的测试来判断:
const a = () => {};
const b = () => {};
const c = a;
console.log(a === b); // false
console.log(a === c); // true
无论何时在您的案例中创建新连接,都会将函数的引用作为回调传递,这意味着每个连接都将调用函数最初存储的同一内存地址。所以你的实现是正确的,你不必担心在这种情况下使用大量内存的可能性:-)