繁体   English   中英

javascript使用socket.io发送对象

[英]javascript sending object with socket.io

我用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);一样简单$.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)
});

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM