gpt4 book ai didi

json - 在类中使用 RxJs Subject 时 JSON.stringify 上的循环对象异常

转载 作者:搜寻专家 更新时间:2023-10-30 21:37:25 25 4
gpt4 key购买 nike

我在使用序列化恰好具有 Rxjs 主题的类时遇到循环对象异常错误。如果我在类里面订阅主题,我将在尝试字符串化时收到循环对象异常。我的示例类...

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

最佳答案

一般来说,observables 和私有(private)成员都不应该被序列化。这会导致序列化对象被不应存在的属性污染。

一种方法是在 JS 输出中隐藏(不可枚举)私有(private) TypeScript 属性。这可以通过装饰器实现:

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 method将由 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;
}
}

关于json - 在类中使用 RxJs Subject 时 JSON.stringify 上的循环对象异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49437819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com