使用socket.io发送对象的javascript
我正在使用socket.io发射对象使用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.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)
});
请注意,深度复制时,循环引用将导致无限循环