使用RxJs Subject在类中时,调用JSON.stringify时出现循环对象异常

3
我在使用序列化一个类时遇到了循环对象异常错误,这个类恰好有一个RxJS Subject。如果我在这个类中订阅主题,当我尝试将其字符串化时,就会出现循环对象异常。我的示例类是...
export class ThingToStringIfy
{
  private someProp : string;
  private aSubject = new Subject();

   constructor() {
     this.aSubject.subscribe();
}

所以我的问题是,我是否以某种方式错误地使用了主题,或者我碰巧找到了一个错误。 我目前只打算使用JSON替换函数或类似circular-json-es6的东西。 如果有解决方法或改进建议,将不胜感激。 如果这是一个错误,我想成为一个好公民并报告它。

谢谢

以下是有问题的代码链接: https://stackblitz.com/edit/angular-cpfsuu?embed=1&file=app/hello.component.ts


你想要将什么转换为字符串?为什么要进行字符串化? - Explosion Pills
这里有一个类似的帖子,涉及可观察对象的序列化:https://dev59.com/9JPea4cB1Zd3GeqP9wYG - user6749601
1个回答

3

通常,既非观察者也非私有成员不应该被序列化。这会导致在序列化对象中加入不应该存在的属性。

一种方法是使私有TypeScript属性在JS输出中被隐藏(非可枚举)。可以通过使用装饰器来实现此目的:

function Private() {
  return function (target: any, prop: string, descriptor?: PropertyDescriptor) {
    if (descriptor) {
      // method
      descriptor.enumerable = false;
    } else {
      // property initializer
      let propSymbol = Symbol(prop);

      Object.defineProperty(target, prop, {
        configurable: true,
        enumerable: false,
        get() { return this[propSymbol] },
        set(value) { this[propSymbol] = value }
      });
    }
  };
}

export class ThingToStringIfy {
  @Private() private someProp : string;
  @Private() private aSubject = new Subject();
  ...
}

装饰器可使private属性在JSON.stringify和其他只期望自有可枚举属性的地方被排除。
另一种方法是实现toJSON方法,该方法将被JSON.stringify使用,而不是默认程序:
export class ThingToStringIfy {
  private someProp : string;
  private aSubject = new Subject();
  ...
  toJSON() {
    const publicThis = Object.assign({}, this);
    // or lodash.omit or any alternative
    delete publicThis['someProp'];
    delete publicThis['aSubject'];
    return publicThis;
  }
}

非常好.. 我唯一需要更改的是在 Private 前面添加 @ 符号。 - Jon Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接