2012-02-12 4 views

ответ

13

Вызов socket.foo устанавливает вашу собственность на сам объект сокета. Это не рекомендуется, потому что вы можете переопределить внутреннее свойство, которое использует сокет и зависит от него. Когда вы вызываете 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; 
}; 
+0

+1 для включения определения функции! Значит, это только вопрос об избежании конфликтов имен? Любые другие преимущества использования своего хранилища данных? – knite

+0

Насколько я знаю, я думаю, что столкновение - это главное. – JohnP

+11

Кроме того, чтобы расширить этот ответ, причиной метода get/set/del является передача ключа/значения адаптеру, по умолчанию это «MemoryStore», но вы можете легко изменить адаптер на mysql, redis, mongo и т.д. – RobertPitt

2

Я считаю, что основная причина, так что данные, присоединенные к разъему безопасно многозадачность.

Если вы работаете с одним процессом, всегда будет один процесс, и вы уверены, что не перекрываете внутренний атрибут, socket.foo = bar будет в порядке. Было бы лучше всего использовать get/set в качестве основы для будущей проверки и лучших практик.

В многопроцессном мире, если вы установили socket.foo = bar в один процесс, то в другом процессе socket.foo будет неопределенным.

Смежные вопросы