javascript使用socket.io发送对象

时间:2013-10-17 20:56:45

标签: javascript node.js socket.io

我使用socket.io

发出对象
socket.emit('object',{"object":collection});

但有时当socket.io无法正常发出对象,因为无法到达服务器时,socket.io会记住在内存中发出的内容,但收集更改同时在服务器上我们收到空对象。

我也尝试了

socket.emit('object',function(collection){
    return {"object":collection};
}(collection)

但它与同一个空对象一样(同时集合是空的。

1 个答案:

答案 0 :(得分:1)

JavaScript中的对象通过引用传递。异步函数之外对此类对象的任何更改都会在稍后的对象本身中反映出来。

一个简单的解决方案是复制该对象,方法是创建一个具有原始属性(可能是方法......)的新对象。

arrays 的示例就是这个简洁的小代码:[].concat(collection);。但既然我们在这里谈论对象,那就行不通了。 使用jQuery ,这就像$.extend({}, collection);一样简单,但由于你没有标记它,让我们自己制作该方法的版本。

function extend( to, from, deep ) {
  // Double negation to force deep to be a boolean even if not provided. Thus: defaults to false.
  deep = !!deep;

  for( var i in from ) {
    if( deep ) {
      if( typeof from[i] == 'object' ) {
        // Array?
        if( from[i].length && typeof from[i].splice == 'function' ) {
          to[i] = [].concat(from[i]);
        }
        // nested object!
        else {
          to[i] = {};
          extend(to[i], from[i], deep);
        }
      }
      else {
        to[i] = from[i];
      }
    }
  }

  return to;
}

将其应用于socket.emit

socket.emit('object', {
  'object' : extend({}, collection, true)
});

请注意,深度复制时循环引用将导致无限循环。