Javascript 如何取消订阅或取消对RxJS可观测的大型阵列的过滤?

Javascript 如何取消订阅或取消对RxJS可观测的大型阵列的过滤?,javascript,rxjs,reactive-programming,Javascript,Rxjs,Reactive Programming,我的理解是,一个完整的阵列被推送到一个订阅者,而不是一个可以取消订阅/取消的间隔观察者 例如,以下取消工作 //每秒发出一个值,持续约10秒 设obs=Rx.可观测间隔(1000) .take(10) let sub=obs.subscribe(console.log); //但大约4秒钟后取消 设置超时(()=>{ console.log(“取消”); sub.取消订阅() }, 4000); 在数组上使用(…)时,所有值都将同步发出,这不允许将任何执行时间授予用于取消订阅的设置超时。实际上

我的理解是,一个完整的阵列被推送到一个订阅者,而不是一个可以取消订阅/取消的间隔观察者

例如,以下取消工作

//每秒发出一个值,持续约10秒
设obs=Rx.可观测间隔(1000)
.take(10)
let sub=obs.subscribe(console.log);
//但大约4秒钟后取消
设置超时(()=>{
console.log(“取消”);
sub.取消订阅()
}, 4000);
在数组上使用(…)
时,所有值都将同步发出,这不允许将任何执行时间授予用于取消订阅的
设置超时。实际上,它在到达
setTimeout
的行之前完成发射。要允许emit不占用线程,可以使用异步调度程序(
from(…,Rx.scheduler.async)
),它将使用
setInterval
调度工作

以下是文件:

下面是一个运行示例。我不得不将超时时间提高到100,以便有更多的空间呼吸。这当然会减慢你的执行速度。我不知道你为什么要这样做。如果您能分享确切的用例,我们可能会提供一些更好的建议

//发出一个范围
让largeArray=[…数组(9999).keys()];
让obs=Rx.Observable.from(largeArray,Rx.Scheduler.async);
let sub=obs.subscribe(console.log);
//但大约1毫秒后取消
设置超时(()=>{
console.log(“取消”);
sub.取消订阅()
}, 100);
// ... 不取消
在数组上使用(…)
时,所有值都将同步发出,这不允许将任何执行时间授予用于取消订阅的
设置超时。实际上,它在到达
setTimeout
的行之前完成发射。要允许emit不占用线程,可以使用异步调度程序(
from(…,Rx.scheduler.async)
),它将使用
setInterval
调度工作

以下是文件:

下面是一个运行示例。我不得不将超时时间提高到100,以便有更多的空间呼吸。这当然会减慢你的执行速度。我不知道你为什么要这样做。如果您能分享确切的用例,我们可能会提供一些更好的建议

//发出一个范围
让largeArray=[…数组(9999).keys()];
让obs=Rx.Observable.from(largeArray,Rx.Scheduler.async);
let sub=obs.subscribe(console.log);
//但大约1毫秒后取消
设置超时(()=>{
console.log(“取消”);
sub.取消订阅()
}, 100);
// ... 不取消

我已将@bygrace的答案标记为正确。非常感谢!正如在他回答的评论中提到的,我正在发布一个observable的自定义实现,它确实支持这样的兴趣取消

const observable=stream=>{
让时光流逝;
返回{
订阅:observer=>{
timerID=setInterval(()=>{
如果(stream.length==0){
observer.complete();
清除间隔(timerID);
timerID=未定义;
}
否则{
observer.next(stream.shift());
}
}, 0);
返回{
取消订阅:()=>{
if(timerID){
清除间隔(timerID);
timerID=未定义;
观察员。取消();
}
}
}
}
}
}
//将在控制台中计数为9999。。。
让largeArray=[…数组(9999).keys()];
设obs=可观测(大射线);
让sub=obs.subscribe({
下一步:a=>console.log(a),
取消:()=>console.log('cancelled')
});
//除非我在这里取消

设置超时(sub.unsubscribe,200)我已将@bygrace的答案标记为正确。非常感谢!正如在他回答的评论中提到的,我正在发布一个observable的自定义实现,它确实支持这样的兴趣取消

const observable=stream=>{
让时光流逝;
返回{
订阅:observer=>{
timerID=setInterval(()=>{
如果(stream.length==0){
observer.complete();
清除间隔(timerID);
timerID=未定义;
}
否则{
observer.next(stream.shift());
}
}, 0);
返回{
取消订阅:()=>{
if(timerID){
清除间隔(timerID);
timerID=未定义;
观察员。取消();
}
}
}
}
}
}
//将在控制台中计数为9999。。。
让largeArray=[…数组(9999).keys()];
设obs=可观测(大射线);
让sub=obs.subscribe({
下一步:a=>console.log(a),
取消:()=>console.log('cancelled')
});
//除非我在这里取消

设置超时(sub.unsubscribe,200)数组方法在timeout@Fabricio谢谢,但问题是如何克服?问题到底是什么?克服什么?您发布的内容是默认的(和所需的)behaviour@bugs-如问题所述。。。如何取消订阅或取消对RxJS可观测的大型阵列的过滤?阵列方法在timeout@Fabricio谢谢,但问题是如何克服?问题到底是什么?克服什么?您发布的内容是默认的(和所需的)behaviour@bugs-如问题所述。。。如何取消订阅或取消对RxJS可观测的大型阵列的过滤?非常感谢!我想知道RxJS调度程序是否是答案的一部分。我自己写了一个定制的observable,这无疑是做了一些类似的事情。我可能会在另一个答案中为子孙后代写下这方面的代码。非常感谢!我想知道RxJS调度程序是否是答案的一部分。我自己写了一个定制的可观察的,wh