【发布时间】:2018-11-30 05:57:29
【问题描述】:
我(错误地)认为扫描操作员每次遍历都会返回一个新对象。我最近发现情况并非如此。
我从learnrxjs.io 分叉了这个例子来说明我的意思here。
看一下代码:
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 中向下传递的流,并在scan 累加器函数中注销accumulator 的值。
查看控制台,显示累加器包含mutating:"test"在第一遍和后续遍之后:
除非我弄错了,否则这表明我可以在订阅线和订阅线的任何位置改变流对象。我想这并不让我感到惊讶,因为它是一个对象引用。但是,我认为scan 运算符总是会返回一个新对象,以防止其内部累加器发生变异...
我首先想到的是像这样映射一个新对象:
scan((acc, curr) => Object.assign({}, acc, curr), {}),
map(data=>Object.assign({}, data))
但这对我来说似乎很奇怪。
我所展示的行为是预期的,还是我不明白这一切是如何运作的?如何防止累加器发生变异?
谢谢
【问题讨论】:
-
你小心翼翼地从
curr复制了所有内容,那么为什么突变仍然存在令人惊讶呢?是的,您正在构建一个新对象,但具有所有旧属性。 -
我以为scan算子每次缩小都会返回一个新对象