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>
subscribe
関数は、作成時に1回だけ起動するように見えます。私は実際には、配列の変化を観察するのではなく、配列ごとに対応しているだけなので、少し誤解されているようです。そのコードは、ウィキにあるものとほとんど同じです。ですから、私が間違っているか、subscribe
が期待どおりに機能しません。
Observable.fromArrayは、サブスクライバーを追加すると、各配列アイテムのイベントを即座に発生させるObservableを作成します。したがって、そのアレイへの変更を「監視」することはありません。
「プッシュ可能なコレクション」が必要な場合は、 Bacon.js のBusクラスが探している可能性があります。 RxJの場合、同様の機能を持つ私の小さな MessageQueue クラスがあります。
RxJSでは、探しているものはSubject
と呼ばれます。データをそこにプッシュして、そこからストリーミングすることができます。
例:
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));
Rx.Observable.ofObjectChanges(obj) が期待どおりに機能することがわかりました。
ドキュメントページから:
Object.observeを使用して、オブジェクトへの変更からObservableシーケンスを作成します。
それが役に立てば幸い。
これはどう:
var subject = new Rx.Subject();
//scan example building an array over time
var example = subject.scan((acc, curr) => {
return acc.concat(curr);
}
,[]);
//log accumulated values
var subscribe = example.subscribe(val =>
console.log('Accumulated array:', val)
);
//next values into subject
subject.next(['Joe']);
subject.next(['Jim']);