Javascript 可观察管道中的异常被抑制
假设我希望可观测物周期性地发射值,直到另一个可观测物发射。所以我可以使用Javascript 可观察管道中的异常被抑制,javascript,rxjs,Javascript,Rxjs,假设我希望可观测物周期性地发射值,直到另一个可观测物发射。所以我可以使用定时器和takeUntil来实现这一点。 但我想处理每个发出的值,并在某些条件变为真时停止(错误)发出。所以我写下一段代码: const{timer,Subject}='rxjs'; const{takeUntil,map}='rxjs/operators'; const s=新主题(); 让计数=0; 函数processItem(项目){ 计数++; 返回计数{ if(processItem(值)){ log(`Proce
定时器
和takeUntil
来实现这一点。
但我想处理每个发出的值,并在某些条件变为真时停止(错误)发出。所以我写下一段代码:
const{timer,Subject}='rxjs';
const{takeUntil,map}='rxjs/operators';
const s=新主题();
让计数=0;
函数processItem(项目){
计数++;
返回计数<3;
}
const value=“MyValue”;
计时器(0,1000)。管道(
(s),
地图(()=>{
if(processItem(值)){
log(`Processing done`);
返回值;
}否则{
s、 其次(正确);
s、 完全();
console.error(`Processing error`);
抛出新错误(“停止管道”);
}
}),
)
但是,我没有得到错误,而是完成了我的可观测数据。
只有当我注释掉takeUntil(s)
操作符时,我才会得到错误。
看起来,当管道操作符完成时,它的值不会立即发出,而是在管道的下一次“迭代”结束时被记住并发出,然后被新结果替换,依此类推。在我的情况下,应该发出错误的下一次迭代是由
takeUntil
阻止的。问题是,我的假设正确吗?如果是的话,为什么rxjs是这样设计的?首先,每个Rx链可以发出一个错误或一个完整的通知,但决不能同时发出这两个通知。(见“合同管理通知”一节)
takeUntil
操作员发出complete
可观察到的通知时(s
在您的情况下)发出任何下一个通知。这意味着当s
发出时,链将完成,您将不会收到任何进一步的错误
通知
最后一件可能也是最令人困惑的事情是,RxJS中的一切都是同步发生的,除非您使用时间(例如,delay
operator),或者您专门将observeOn
operator与异步调度器一起使用。因此,当您调用s.next(true)
insidemap
时,此next
通知会立即传播到takeUntil
,从而完成链,正如我上面提到的,您可以收到一个错误
或一个完成
通知,但不能同时收到这两个通知
看起来您甚至不需要使用takeUntil
,因为如果您在map
中抛出一个错误,它会自动包装并作为错误
通知()而且该链是自动处理的,因此没有必要在之后尝试使用take来完成它,直到
首先,每个接收链可以发出一个错误
或一个完成
通知,但决不能同时发出这两个通知。(见“合同管理通知”一节)
takeUntil
操作员发出complete
可观察到的通知时(s
在您的情况下)发出任何下一个通知。这意味着当s
发出时,链将完成,您将不会收到任何进一步的错误
通知
最后一件可能也是最令人困惑的事情是,RxJS中的一切都是同步发生的,除非您使用时间(例如,delay
operator),或者您专门将observeOn
operator与异步调度器一起使用。因此,当您调用s.next(true)
insidemap
时,此next
通知会立即传播到takeUntil
,从而完成链,正如我上面提到的,您可以收到一个错误
或一个完成
通知,但不能同时收到这两个通知
看起来您甚至不需要使用takeUntil
,因为如果您在map
中抛出一个错误,它会自动包装并作为错误
通知()链是自动处理的,因此在这之后尝试使用takeUntil
来完成它是没有意义的。感谢您的解释,这句话“最后一件事,也可能是最令人困惑的是,RxJS中的一切都是同步发生的,除非您与时间一起工作”澄清了很多。关于s
,它存在于实际问题中,用于从外部阻止管道,我不能跳过map
中的s.next
,因为我需要通知另一方处理已完成/出错,然后您可以调用s.next(true)
在subscribtion中形成一个错误处理程序,或者添加点击
和错误处理程序?>添加点击和错误处理程序谢谢你,我会尝试这样做谢谢你的解释,这句话“最后一件事,可能是最令人困惑的是,RxJS中的一切都是同步发生的,除非你与时间一起工作”澄清了很多。关于s
,它存在于实际问题中,用于从外部阻止管道,我不能跳过map
中的s.next
,因为我需要通知另一方处理已完成/出错,然后您可以调用s.next(true)
在subscribtion中形成一个错误处理程序,或者添加tap
with和错误处理程序?>添加tap with和错误处理程序谢谢,我会尝试的