Socket.io,socket.set()和socket属性之间的区别是什么?

13

Socket.io建议使用以下方式设置每个套接字(socket)的变量:

socket.set('foo', bar, function () {});

变量也可以在套接字上进行设置和访问:

socket.foo = bar

使用提供的set()函数是否有好处?

2个回答

14

调用socket.foo将在socket对象本身上设置您的属性。这不是推荐的做法,因为您可能会覆盖socket使用和依赖的内部属性。当您调用socket.set()时,它会存储在一个内部数据结构中,不会与内部属性冲突。

https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L246

Socket.prototype.set = function (key, value, fn) {
  this.store.set(key, value, fn);
  return this;
};

+1 包括函数定义!那么这只是避免命名空间冲突的问题吗?使用他们的数据存储还有其他好处吗? - knite
据我所知,我认为碰撞是主要问题。 - JohnP
11
为了进一步解释,get/set/del 方法的目的是将键/值传递给适配器,默认情况下为“MemoryStore”,但您可以轻松更改适配器为 mysql、redis、mongo 等。 - RobertPitt

2

我认为主要原因在于,这样可以使附加到套接字的数据具有多进程安全性。

如果您的应用程序是单进程,永远都是单进程,并且您确定没有覆盖内部属性,则socket.foo = bar将是可以的。但从未来保护和最佳实践的角度考虑,最好还是使用get/set。

在多进程的世界中,如果您在一个进程中设置了socket.foo = bar,那么在另一个进程中,socket.foo将未定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接