Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可观察管道中的异常被抑制_Javascript_Rxjs - Fatal编程技术网

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)
inside
map
时,此
next
通知会立即传播到
takeUntil
,从而完成链,正如我上面提到的,您可以收到一个
错误
或一个
完成
通知,但不能同时收到这两个通知


看起来您甚至不需要使用
takeUntil
,因为如果您在
map
中抛出一个错误,它会自动包装并作为
错误
通知()而且该链是自动处理的,因此没有必要在之后尝试使用
take来完成它,直到

首先,每个接收链可以发出一个
错误
或一个
完成
通知,但决不能同时发出这两个通知。(见“合同管理通知”一节)

takeUntil
操作员发出
complete
可观察到的通知时(
s
在您的情况下)发出任何
下一个
通知。这意味着当
s
发出时,链将完成,您将不会收到任何进一步的
错误
通知

最后一件可能也是最令人困惑的事情是,RxJS中的一切都是同步发生的,除非您使用时间(例如,
delay
operator),或者您专门将
observeOn
operator与异步调度器一起使用。因此,当您调用
s.next(true)
inside
map
时,此
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和错误处理程序谢谢,我会尝试的