完整地傳播不同的事件流我需要通過一個主題代理所有不同的事件流。使用一個主題通過
我想出了這個代碼:
var mySubject,
getObservable;
getObservable = function (subject, eventName) {
return subject
.asObservable()
.filter(function (x) {
return x.EventName === eventName;
})
.flatMap(function (x) {
if (x.Type === 'onNext') {
return Rx.Observable.return(x.Data);
}
if (x.Type === 'onError') {
return Rx.Observable.throw(x.Data);
}
return Rx.Observable.empty();
});
};
mySubject = new Rx.Subject();
getObservable(mySubject, 'foo')
.subscribe(function(x){
console.log('foo onNext ' + x);
}, function(x){
console.log('foo onError ' + x);
}, function(){
console.log('foo onComplete');
});
getObservable(mySubject, 'bar')
.subscribe(function(x){
console.log('bar onNext ' + x);
}, function(x){
console.log('bar onError ' + x);
}, function(){
console.log('bar onComplete');
});
mySubject.onNext({Type: 'onNext', EventName: 'foo', Data: 5});
mySubject.onNext({Type: 'onCompleted', EventName: 'foo'});
mySubject.onNext({Type: 'onNext', EventName: 'bar', Data: 5});
mySubject.onNext({Type: 'onError', EventName: 'bar', Data: 'Error message'});
得到輸出:
foo onNext 5
bar onNext 5
bar onError Error message
預期輸出:
foo onNext 5
foo onCompleted
bar onNext 5
bar onError Error message
對於bar
事件,這就像一個魅力:onNext
將會傳播d並且一旦錯誤發生,onError
函數被調用並且事件流結束。但是,我無法讓它爲onComplete
工作。
每當一個完整的通知提出我看到,Rx.Observable.empty()
被調用,但不會導致訂戶onComplete
處理程序被調用。相反,它調用它的onNext
處理程序。
偉大的工作邁克。不過,我不明白爲什麼我最初的嘗試不起作用。 – Christoph 2012-03-06 13:30:26