12

fromArray Rx wiki on githubÈ possibile osservare aggiunte a un array con 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>   

Sembra veramente la funzione subscribe sarà sparare solo una volta, quando è creato. Sembra che sia un po 'un termine improprio, dal momento che io sono solo per la matrice, invece di osservare i cambiamenti su di essa. Questo codice è quasi identico a quello che si trova sul wiki. Quindi o sto sbagliando o il subscribe non funziona come mi aspetto.

risposta

1

Observable.fromArray crea un Observable che attiva immediatamente gli eventi per ogni elemento dell'array quando si aggiunge un Sottoscrittore. Quindi, non "guarderà" le modifiche a quell'array.

Se hai bisogno di una "raccolta pushable", la classe Bus in Bacon.js potrebbe essere quello che stai cercando. Per RxJs c'è la mia piccola classe MessageQueue che ha una funzionalità simile.

+4

quindi è un osservatore che ... non lo fa. Chi viene con queste cose? (retorico). Grazie per il suggerimento su MessageQueue. – jcollum

+0

Oh, e poi c'è FRB (http://documentup.com/montagejs/frb/) che ti darebbe effettivamente collegamenti osservabili su qualsiasi oggetto JS. O almeno qualsiasi proprietà di un oggetto. Non sono sicuro di osservare direttamente un array. – raimohanska

+1

L'utilizzo di un'altra libreria per qualcosa che RxJS fornisce fuori dagli schemi con "Soggetti" non è un buon approccio dal mio punto di vista. – TekTimmy

2

Ho trovato Rx.Observable.ofObjectChanges(obj) funzionare come mi aspettavo.

Dalla pagina di documentazione:

Crea una sequenza osservabile da modifiche a un oggetto utilizzando Object.observe.

Spero che sia d'aiuto.

+0

Probabilmente si dovrebbe usare 'ofArrayChanges' poichè l'OP riguarda specificamente gli array ... – Lucas

+3

ofObjectChanges non è più disponibile in RxJS 5: https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md – kpup

10

In RxJS quello che stai cercando si chiama Subject. Puoi spingere i dati in esso e trasmetterli da lì.

Esempio:

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

qual è il 'array' per nel tuo esempio? @Frederik –

+1

Questo è l'array attuale che contiene gli elementi. Quando si preme un elemento nell'array, si chiama anche next() su arraySubject, in modo da notificare qualsiasi sottoscrittore. Potresti anche costruirlo direttamente nella tua classe, ovviamente. –

+0

amico come andrà a lavorare? se ti iscrivi all'argomento, non osserverai gli elementi già inseriti nell'array, giusto? –

Problemi correlati