RxJS如何映射到do中重新分配的值?

时间:2016-09-14 04:10:08

标签: javascript rxjs

我是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变量的引用。

1 个答案:

答案 0 :(得分:0)

它通常是关于javascript的:问题是通过使用arr = arr.concat(…)每次都创建新数组(不修改现有数组),并将对它的引用保存到arr变量中。 / p>

但是您创建的Observable保持对值arr的引用在可观察创建时引用(空数组)。

如果使用arr.push() - 你没有创建新数组,而是修改现有数组(在mapTo(arr)中使用),所以observable将发出带有修改的数组。