0

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

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

但是有时当socket.io由于无法到达服务器而无法立即发出对象时会发生这种情况,socket.io会在内存中记住该发出,但是与此同时集合会发生变化,并且在服务器上我们会收到空对象。

我也试过

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

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

4

1 回答 1

1

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;
}

将其应用于socket.emit

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

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

于 2013-10-17T21:13:05.523 回答