12

fromArray Rx wiki on githubCzy mogę obserwować dodatki do tablicy za pomocą rx.js?

coffee> rext = require 'rx'             
coffee> arr = [1..5]             
[ 1, 2, 3, 4, 5 ]              
coffee> obs = rext.Observable.fromArray(arr)       
{ _subscribe: [Function] }           
coffee> obs.subscribe((x) -> console.log("added value: " + x))  
added value: 1              
added value: 2              
added value: 3              
added value: 4              
added value: 5              
{ isStopped: true,             
    observer:               
    { isStopped: true,             
    _onNext: [Function],            
    _onError: [Function: defaultError],        
    _onCompleted: [Function: noop] },        
    m: { isDisposed: true, current: null } }       
coffee> arr.push(12) # expecting "added value: 12"            
6      # instead got new length of array            
coffee>   

To naprawdę wygląda funkcji subscribe będzie tylko jeden raz ognia, kiedy to stworzył. Wygląda na to, że jest to trochę mylące, ponieważ jestem po prostu za tym, że szykuję tablicę zamiast obserwować zmiany na niej. Ten kod jest prawie identyczny z tym, który znajduje się na wiki. Więc albo robię to źle, albo subscribe nie działa tak, jak się spodziewam.

Odpowiedz

1

Observable.fromArray tworzy obserwowalne, które natychmiast uruchamia zdarzenia dla każdego elementu tablicy, po dodaniu subskrybenta. Tak więc nie będzie to "obserwowanie" zmian w tej tablicy.

Jeśli potrzebujesz "kolekcji do przesuwania", klasa Bus w Bacon.js może być tym, czego szukasz. Dla RxJs jest moja mała klasa MessageQueue, która ma podobną funkcjonalność.

+4

Więc to jest Observer, że ... nie. Kto wymyśla te rzeczy? (retoryczny). Dzięki za podpowiedź na temat MessageQueue. – jcollum

+0

Och, a następnie jest FRB (http://documentup.com/montagejs/frb/), który faktycznie dałby ci obserwowalne wiązanie na dowolnym obiekcie JS. Lub przynajmniej dowolną właściwość obiektu. Nie jestem pewien, czy bezpośrednio obserwować tablicę. – raimohanska

+1

Używanie innej biblioteki do czegoś, co RxJS dostarcza po wyjęciu z pudełka "Tematy" nie jest dobrym podejściem z mojej perspektywy. – TekTimmy

2

Znalazłem Rx.Observable.ofObjectChanges(obj) do pracy tak, jak się spodziewałem.

Od strony dokumentacji:

Tworzy obserwowalnych sekwencję zmian do obiektu z wykorzystaniem Object.observe.

Mam nadzieję, że to pomaga.

+0

Prawdopodobnie powinien używać 'ofArrayChanges', ponieważ OP jest konkretnie o tablicach ... – Lucas

+3

ofObjectChanges nie jest już dostępny w RxJS 5: https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md – kpup

10

W RxJS to, czego szukasz, nazywa się Subject. Możesz przesyłać do niego dane i przesyłać je strumieniowo.

Przykład:

var array = []; 
var arraySubject = new Rx.Subject(); 

var pushToArray = function (item) { 
    array.push(item); 
    arraySubject.next(item); 
} 

// Subscribe to the subject to react to changes 
arraySubject.subscribe((item) => console.log(item)); 
+0

co to jest 'tablica' w twoim przykładzie? @Frederik –

+1

To faktyczna tablica zawierająca elementy. Kiedy wciskasz element do tablicy, wywołujesz także next() na arraySubject, więc powiadamiasz wszystkich subskrybentów. Oczywiście możesz też zbudować to bezpośrednio w swojej klasie. –

+0

koleś, jak to działa? jeśli subskrybujesz ten temat, nie będziesz obserwował elementów już wypchanych do tablicy, prawda? –

Powiązane problemy