Observables - 防止数组的 onCompleted
Observables - prevent onCompleted for array
假设我有一个这样的数组:
const values = [1,2,3];
我从这个数组创建一个可观察对象,如下所示:
const obs = Rx.Observable.from(values);
我是这样订阅的:
obs.subscribe(
function onNext(result){
console.log('item =>', result);
},
function onError(e){
console.error(e.stack || e);
},
function onCompleted(){
console.log('observable is completed');
}
);
我遇到的问题是,如果我像这样将新项目推送到数组:
setTimeout(function(){
values.push(4);
values.push(5);
values.push(6);
}, 3000 );
这些项目 (4,5,6) 没有出现在 subscribe() 回调中!
所以我的问题是,我们如何创建一个可观察数组,它可以 "remain open" 以便在将来将项目推送到数组时触发观察者回调?
我为此创建了一个要点:
https://gist.github.com/ORESoftware/677ad0a3adf41c04a60829921ba4c4c4
这里是 fiddle:
如果您正在寻找通过直接调用推送值的功能,则需要使用 Subject<T>
。
const values = Rx.Observable.Subject();
setTimeout(function(){
values.onNext(4);
values.onNext(5);
values.onNext(6);
}, 3000 );
使用 subjects 进行日常操作被认为不是一种好的做法,并且违背了 Rx 的精神。 Subjects 本质上是 Rx 的可变变量。
您几乎可以从内置运算符中获得任何您想要的功能,或者创建新的运算符来组合现有的运算符。
假设我有一个这样的数组:
const values = [1,2,3];
我从这个数组创建一个可观察对象,如下所示:
const obs = Rx.Observable.from(values);
我是这样订阅的:
obs.subscribe(
function onNext(result){
console.log('item =>', result);
},
function onError(e){
console.error(e.stack || e);
},
function onCompleted(){
console.log('observable is completed');
}
);
我遇到的问题是,如果我像这样将新项目推送到数组:
setTimeout(function(){
values.push(4);
values.push(5);
values.push(6);
}, 3000 );
这些项目 (4,5,6) 没有出现在 subscribe() 回调中!
所以我的问题是,我们如何创建一个可观察数组,它可以 "remain open" 以便在将来将项目推送到数组时触发观察者回调?
我为此创建了一个要点:
https://gist.github.com/ORESoftware/677ad0a3adf41c04a60829921ba4c4c4
这里是 fiddle:
如果您正在寻找通过直接调用推送值的功能,则需要使用 Subject<T>
。
const values = Rx.Observable.Subject();
setTimeout(function(){
values.onNext(4);
values.onNext(5);
values.onNext(6);
}, 3000 );
使用 subjects 进行日常操作被认为不是一种好的做法,并且违背了 Rx 的精神。 Subjects 本质上是 Rx 的可变变量。
您几乎可以从内置运算符中获得任何您想要的功能,或者创建新的运算符来组合现有的运算符。