簡體   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