RxJS中超时后发出错误

RxJS中超时后发出错误,rxjs,reactive-programming,Rxjs,Reactive Programming,如果一个方法的执行时间超过定义的超时时间,我想发出一个错误。我试过这个(ES6): getExec(){ 返回_getObs().timeout(5000,新错误(“达到超时”);//5s超时 } _getObs(){ 返回rx.Observable.create((子项)=>{ sub.onNext(executeVerySlowMethod()); sub.onCompleted(); }); } 当我订阅到getExec时,它不会引发任何错误。我做错了什么?(ExecuteEverySl

如果一个方法的执行时间超过定义的超时时间,我想发出一个错误。我试过这个(ES6):

getExec(){
返回_getObs().timeout(5000,新错误(“达到超时”);//5s超时
}
_getObs(){
返回rx.Observable.create((子项)=>{
sub.onNext(executeVerySlowMethod());
sub.onCompleted();
});
}

当我订阅到
getExec
时,它不会引发任何错误。我做错了什么?(
ExecuteEverySlowMethod
是一种非常慢的方法,需要5秒以上)

没有出现带有自定义错误的
.timeout()
重载。这已在RxJs5中删除。您的代码将出错,因为第二个参数的类型应为
Scheduler | null

还有,;只需使用
observable.of(executeEverySlowMethod())
就可以更轻松地创建一个observable来包装函数

Observable
  .of(executeVerySlowMethod())
  .timeout(5000)

除非
executeEverySlowMethod()
正在阻止//同步。

没有可接受自定义错误的
.timeout()
重载,否则应执行此操作。这已在RxJs5中删除。您的代码将出错,因为第二个参数的类型应为
Scheduler | null

还有,;只需使用
observable.of(executeEverySlowMethod())
就可以更轻松地创建一个observable来包装函数

Observable
  .of(executeVerySlowMethod())
  .timeout(5000)

除非
executeEverySlowMethod()
正在阻止//同步,否则应该执行此操作。

这是执行此操作的新方法:(RxJS6)

从'rxjs'导入{of,TimeoutError,throwError};
从“rxjs/operators”导入{timeout,catchError};
of(executeEverySlowMethod()).pipe(
超时(5000),
catchError(err=>{
if(错误实例of TimeoutError){
抛出新错误(“达到超时”);
}
回程抛掷器(err);
}))

这是一种新的方法:(RxJS6)

从'rxjs'导入{of,TimeoutError,throwError};
从“rxjs/operators”导入{timeout,catchError};
of(executeEverySlowMethod()).pipe(
超时(5000),
catchError(err=>{
if(错误实例of TimeoutError){
抛出新错误(“达到超时”);
}
回程抛掷器(err);
}))

从您的问题中,我了解到
executeEverySlowMethod
正在阻塞?如果是这样,我认为在这种情况下不能使用timeout。如果您仔细想想,外部可观察对象被创建,那么整个脚本会阻塞一段时间,只有在这之后才会附加超时。从超时的角度来看,外部可观察物在短时间内发出。从你的问题中我了解到
executeEveryslowMethod
是阻塞的?如果是这样,我认为在这种情况下不能使用timeout。如果您仔细想想,外部可观察对象被创建,那么整个脚本会阻塞一段时间,只有在这之后才会附加超时。从超时的角度来看,外部可观察到的东西很快就会发出。你能提供ExecuteEverySlowMethod的非阻塞版本吗?没有关于
ExecuteEverySlowMethod
的任何实现细节吗?我正试图构建某种断路器,所以给定一个超时,我想在方法达到超时时中断执行。在像Node这样的单线程环境中,这是可能的吗?这当然是可能的。最重要的是不要阻止eventloop。要中止工作,最简单的方法就是使用承诺(不再听答案)或观察(取消订阅时主动取消工作)。看一看,非常感谢。这对我帮助很大。HystrixJs使用
setTimeout
来解决我需要的问题:再次感谢!您能提供executeVerySlowMethod的非阻塞版本吗?没有任何关于
executeVerySlowMethod
的实现细节吗?我正在尝试构建某种断路器,因此给定一个超时,我希望在方法达到超时时中断执行。在像Node这样的单线程环境中,这是可能的吗?这当然是可能的。最重要的是不要阻止eventloop。要中止工作,最简单的方法就是使用承诺(不再听答案)或观察(取消订阅时主动取消工作)。看一看,非常感谢。这对我帮助很大。HystrixJs使用
setTimeout
来解决我需要的问题:再次感谢!您忘记在
catchError()
运算符中重新抛出原始错误。您忘记在
catchError()
运算符中重新抛出原始错误。