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
函数只会在创建时触发一次。看起来它有点用词不当,因为我真的只是为了 - 每个数组而不是观察它的变化。该代码几乎与维基上的代码完全相同。所以要么我做错了,要么subscribe
不能达到预期效果。
答案 0 :(得分:12)
在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));
答案 1 :(得分:2)
当您添加订阅服务器时,Observable.fromArray会创建一个Observable,它会立即触发每个数组项的事件。因此,它不会“观察”对该阵列的更改。
如果您需要“可推送的集合”,Bacon.js中的Bus类可能就是您正在寻找的。对于RxJs,我的小MessageQueue类具有类似的功能。
答案 2 :(得分:2)
我发现Rx.Observable.ofObjectChanges(obj)正如我预期的那样工作。
从文档页面:
使用Object.observe从对象的更改创建一个Observable序列。
希望它有所帮助。
答案 3 :(得分:0)
这个怎么样:
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']);