2016-09-14 38 views
1

我是RxJS的新手,我想了解如何管理副作用。RxJS我該如何映射一個在do中被重新分配的值?

在下面的例子中,我認爲每次點擊鼠標時,都會記錄一個隨機數組(每次點擊一個新的隨機數)。但我得到的每一次都是一個空陣列,儘管潛在的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] 

我得到了我exepected。

有趣的是,按預期工作:

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

只是想知道,爲什麼不使用'clicks.mapTo(Math.random())',然後'掃描'他們到一個數組? –

回答

0

這是關於JavaScript的一般問題:問題是,通過使用arr = arr.concat(…)您每次創建新的數組(不修改現有的),並將其參考保存到arr變量。

但是您創建的Observable擁有參考值arr在可觀察創建(空數組)時引用。

在使用arr.push()的情況下 - 您並未創建新陣列,而是修改現有陣列(在mapTo(arr)中使用過),因此可觀察陣列將發出修改後的陣列。

相關問題