rxjs - rxjs:扫描累加器突变
问题描述
我(错误地)认为扫描操作员每次通过都会返回一个新对象。我最近发现事实并非如此。
我已经从learnrxjs.io分叉了这个例子来演示我在这里的意思。
看一下代码:
const subject = new Rx.Subject();
const example = subject.scan((acc, curr) => {
console.log('Accumulator', acc);
return Object.assign({}, acc, curr)
}, {});
//log accumulated values
const subscribe = example.subscribe(val => {
val.mutating = 'test'
console.log('Accumulated object:', val)
});
//next values into subject, adding properties to object
subject.next({name: 'Joe'});
// {name: 'Joe'}
subject.next({age: 30});
// {name: 'Joe', age: 30}
subject.next({favoriteLanguage: 'JavaScript'});
// {name: 'Joe', age: 30, favoriteLanguage: 'JavaScript'}
我正在改变val
传递的流subscription
并注销累加器函数accumulator
中的值。scan
查看控制台,它显示累加器包含mutating:"test"
在第一次和后续传递之后:
除非我弄错了,否则这表明我可以在订阅线和订阅线的任何位置改变流对象。我想这并不让我感到惊讶,因为它是一个对象引用。但是,我认为scan
运算符总是会返回一个新对象,以防止其内部累加器发生变异......
我首先想到的是映射一个像这样的新对象:
scan((acc, curr) => Object.assign({}, acc, curr), {}),
map(data=>Object.assign({}, data))
但这对我来说似乎很奇怪。
我展示的行为是预期的还是我不理解这一切是如何运作的?如何防止累加器发生变异?
谢谢
解决方案
是的,它是一个对象引用->acc
您正在更改。您可以像下面这样冻结对象以阻止它发生变异。
return Object.freeze(Object.assign({},acc, curr));
推荐阅读
- kubernetes - 用于响应内容操作的 Kubernetes Ingress Gateway
- visual-studio-code - 需要帮助在 VSCode 中为 Rstudio 的 pandoc 分配全局设置,以 .rmd 输出格式编织 pdf_document
- marklogic - 如何编写查询以匹配多个值
- substrate - 在 deposit_event 中将 Enum RawEvent 转换为关联类型 Event
- elasticsearch - Elasticsearch 过滤器不过滤
- c# - 在Excel c#中锁定单元格有什么问题
- java - 如何在java中从MySQL打印出特定列
- reactjs - 在打字稿中使用类型对象的键推断类型
- c# - 有没有办法使用 Windows 10 API 查找所有 COM 端口设备
- r - mlr3 重采样自动调谐器 - 不显示调谐参数?