rxjs:扫描累加器突变

标签 rxjs rxjs6

我(错误地)认为扫描操作符每次都会返回一个新对象。我最近发现事实并非如此。

我已经从 learnrxjs.io fork 了这个示例来证明我的意思 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'}

我正在改变 subscription 中向下传递的 val 并在 scan 中注销 accumulator 的值 累加器函数。

查看控制台,它显示累加器在第一次和后续传递后包含 mutating:"test":

enter image description here

除非我弄错了,否则这表明我可以在订阅中的任何位置改变流对象。我想这并不令我惊讶,因为它是一个对象引用。但是,我认为 scan 运算符总是会返回一个新对象,以防止其内部累加器发生突变......

我首先想到的是映射一个像这样的新对象:

scan((acc, curr) => Object.assign({}, acc, curr), {}),
map(data=>Object.assign({}, data))

但这对我来说似乎很奇怪。

我所展示的行为是预期的还是我不明白这一切是如何运作的?如何防止累加器发生变异?

谢谢

最佳答案

是的,它是您要更改的对象引用 -> acc。您可以像下面一样卡住对象以阻止其变异。

 return Object.freeze(Object.assign({},acc, curr));

关于rxjs:扫描累加器突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53546601/

相关文章:

angular - 指定 rxjs observable 的 "error"处理程序的类型

javascript - 使用 RxJS 事件流进行简单的序列管理

angular - RxJs 可观察 : How to intercept a cold observable?

javascript - 为什么 throttle 不工作?

rxjs - 当其他史诗正在运行时是否可以执行 `skip` ?

javascript - 订阅 onComplete 永远不会用 flatMap 完成

angular - 从 HttpInterceptor 中的 catchError 返回可观察到的捕获错误会导致错误循环

angular - RxJs zip 运算符,检查哪一个抛出错误并根据条件继续?

angular - RxJs:如何跨多个组件维护一个 WebSocket 连接?

javascript - 监听函数执行