2016-08-28 39 views
5

pracuję przez RxJSKoans i widzę okresowy wzór karmienie w tablicy wyników, że abonent naciska na nowe wartości:RxJS z niezmiennymi strukturami danych?

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

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

To wyraźnie nieczyste funkcja; tablica result jest zmutowana przez subskrybowanie.

Widziałem small-scale projects on Github, które robią dźgnięcie przy użyciu Immutable.js, ale żaden nie jest aktywnie konserwowany.

Zastanawiam się, czy istnieje powszechnie przyjęty niezmienny wzór wdrożenia, a jeśli nie, dlaczego?

Odpowiedz

5

ja nie nazwałbym tego wzoru, ale ponieważ wszystko można przekazać za pomocą strumienia można również przejść w dowolnym niezmiennej struktury danych:

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/[email protected]/dist/global/Rx.umd.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

Również Nie ma powodem, dla którego result jest stan zewnętrzny. Oto, jakie są metody takie jak scan. Jest to proponuję zrobić, aby zarządzać (wewnętrzne) Stan:

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');
<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.umd.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

+1

Chciałbym ostrzec mimo że niektórzy operatorzy rxjs pracy z JavaScript tablic, a nie z listy. Następnie musisz umieścić operatora spłaszczającego wewnątrz operatora 'map' rxjs zwracającego' data.toJS() ', a innego wykonującego' Immutable.fromJS (data) '. Jednak nie stanie się tak często. –

Powiązane problemy