我是RxJS的新手,我试图了解如何管理副作用。
在下面的示例中,我希望在每次单击鼠标时,会记录一个随机数组(每次点击一个新的随机数)。但我得到的只是一个空数组,尽管基础arr
引用显示正确的值。
var clicks = Rx.Observable.fromEvent(document, 'click');
var arr = [];
var obs = clicks
.do(() => { arr = arr.concat(Math.random()); })
.mapTo(arr);
obs.subscribe(x => console.log(x));
每次点击多次会记录一个空数组:[]
但如果我退出arr
:
[0.5336263577508611, 0.8818515430970437, 0.7067802753822072]
我得到了我所期待的。
有趣的是,这可以按预期工作:
var clicks = Rx.Observable.fromEvent(document, 'click');
var arr = [];
var obs = clicks
.do(() => { arr.push(Math.random()); })
.mapTo(arr);
obs.subscribe(x => console.log(x));
push
arr
如何发挥作用,但重新分配它并不起作用?好像mapTo
应该只返回对arr
变量的引用。
答案 0 :(得分:0)
它通常是关于javascript的:问题是通过使用arr = arr.concat(…)
每次都创建新数组(不修改现有数组),并将对它的引用保存到arr
变量中。 / p>
但是您创建的Observable保持对值arr
的引用在可观察创建时引用(空数组)。
如果使用arr.push()
- 你没有创建新数组,而是修改现有数组(在mapTo(arr)
中使用),所以observable将发出带有修改的数组。