All*_*ate 5 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']
Run Code Online (Sandbox Code Playgroud)
这显然是一个不纯的功能; 该result数组由subscribe变异.
我已经看到Github上的小规模项目使用Immutable.js对此进行了攻击,但没有一个被积极维护.
我想知道是否有广泛采用的不可变实现模式,如果没有,为什么?
我不会称之为模式,但由于您可以通过流传递所有内容,因此您还可以传入任何不可变的数据结构:
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 }));Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
此外,没有理由result作为外部状态.这是什么方法scan.这是我建议您管理(内部)状态:
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');Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2971 次 |
| 最近记录: |