12

fromArray Rx wiki on githubKann ich Ergänzungen zu einem Array mit rx.js beobachten?

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>   

Es sieht wirklich wie die subscribe Funktion wird nur Feuer eine Zeit, wenn es erstellt wird. Es scheint, als wäre es ein bisschen irreführend, denn ich bin wirklich nur dafür da, das Array zu beobachten, anstatt Änderungen darauf zu beobachten. Dieser Code ist fast genau der gleiche wie im Wiki. Also entweder mache ich es falsch oder die subscribe funktioniert nicht, wie ich es erwarte.

Antwort

1

Observable.fromArray erstellt ein Observable, das beim Hinzufügen eines Abonnenten sofort Ereignisse für die einzelnen Arrayelemente auslöst. Also wird es die Änderungen an diesem Array nicht "beobachten".

Wenn Sie eine "drückbare Sammlung" benötigen, könnte die Bus-Klasse in Bacon.js das sein, was Sie suchen. Für RxJs gibt es meine kleine MessageQueue Klasse, die eine ähnliche Funktionalität hat.

+4

So ist es ein Beobachter, die ... nicht. Wer hat dieses Zeug? (rhetorisch). Danke für den Hinweis zu MessageQueue. – jcollum

+0

Oh, und dann gibt es FRB (http://documentup.com/montagejs/frb/), die Ihnen tatsächlich beobachtbare Bindungen auf jedem JS-Objekt geben würden. Oder zumindest jede Eigenschaft eines Objekts. Nicht sicher, ein Array direkt zu beobachten. – raimohanska

+1

Die Verwendung einer anderen Bibliothek für etwas, das RxJS aus der Box mit "Themen" bietet, ist aus meiner Sicht kein guter Ansatz. – TekTimmy

2

Ich fand Rx.Observable.ofObjectChanges(obj) zu arbeiten, wie ich es erwartet hatte.

Aus der Dokumentation Seite:

Erstellt eine beobachtbare Folge von Änderungen an einem Objekt mit Object.observe.

Ich hoffe, es hilft.

+0

Sollte wahrscheinlich 'ofArrayChanges' verwenden, da das OP speziell auf Arrays ... – Lucas

+3

ofObjectChanges ist nicht mehr verfügbar in RxJS 5: https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md – kpup

10

In RxJS, was Sie suchen, heißt ein Subject. Sie können Daten hineinschieben und von dort streamen.

Beispiel:

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

was ist das 'Array' für in Ihrem Beispiel? @Frederik –

+1

Das ist das eigentliche Array, das die Elemente enthält. Wenn Sie ein Element in das Array schieben, rufen Sie auch next() auf dem ArraySubject auf, sodass Sie alle Abonnenten benachrichtigen. Das könntest du natürlich auch direkt in deine eigene Klasse einbauen. –

+0

Mann, wie wird das funktionieren? Wenn Sie den Betreff abonnieren, werden Sie die Elemente, die bereits in das Array geschoben wurden, nicht beobachten, oder? –

Verwandte Themen