[英]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.