Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用socket.io发送对象的javascript_Javascript_Node.js_Socket.io - Fatal编程技术网

使用socket.io发送对象的javascript

使用socket.io发送对象的javascript,javascript,node.js,socket.io,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)

我正在使用socket.io发射对象

socket.emit('object',{"object":collection});
但有时当socket.io无法立即发出对象时会发生这种情况,因为无法到达服务器,socket.io会在内存中记住该发出,但同时集合会发生变化,并且在服务器上我们接收到空对象

我也试过了

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

但是它与相同的空对象一起使用(同时集合是空的。

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

一个简单的解决方案是通过创建一个具有原始对象所有属性(可能还有方法…)的新对象来复制该对象

数组的示例是这样一个简洁的小代码:
[].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;
}
将其应用于
套接字.emit

socket.emit('object', {
  'object' : extend({}, collection, true)
});
请注意,深度复制时,循环引用将导致无限循环