RxJS具有不可变数据结构?

时间:2016-08-28 23:55:33

标签: immutability rxjs immutable.js

我正在通过RxJSKoans工作,我看到一系列结果反复出现,用户将新值推送到:

var Rx = require('rx'),
    Subject = Rx.Subject

var result = [];
var s1 = new Subject();
s1.subscribe(result.push.bind(result));
s1.onNext('foo');
result;  // ['foo']

这显然是一个不纯的功能;订阅突变了result数组。

我已经看到small-scale projects on Github使用Immutable.js对此进行了攻击,但没有一个被主动维护。

我想知道是否存在广泛采用的不可变实现模式,如果没有,为什么?

1 个答案:

答案 0 :(得分:5)

我不会将其称为模式,但由于您可以通过流传递所有内容,因此您还可以传入任何不可变数据结构:



const stream$ = Rx.Subject.create();

stream$
  .map(data => data.set('a', data.get('a') + 1))
  .subscribe(data => console.log(data));

stream$.next(Immutable.Map({ a:1 }));
stream$.next(Immutable.Map({ a:2 }));

<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.7/dist/global/Rx.umd.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
&#13;
&#13;
&#13;

此外,没有理由将result作为外部状态。这就是像scan这样的方法。这是我建议您管理(内部)状态:

&#13;
&#13;
const stream$ = Rx.Subject.create();

stream$
  .scan((list, val) => list.push(val), Immutable.List())
  .subscribe(data => console.log(data));

stream$.next('foo');
stream$.next('bar');
&#13;
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.7/dist/global/Rx.umd.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
&#13;
&#13;
&#13;