在RxJS中超时后发出错误

时间:2018-05-17 10:34:02

标签: rxjs reactive-programming

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

getExec() {
    return _getObs().timeout(5000, new Error("timeout reached")); //5s timeout
}

_getObs() {
    return rx.Observable.create((sub) => {
        sub.onNext(executeVerySlowMethod());
        sub.onCompleted();
    });
}

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

2 个答案:

答案 0 :(得分:2)

没有.timeout()可用的重载,它会带来自定义错误。这在RxJs5中被删除。您的代码会出错,因为第二个参数应该是Scheduler|null类型。

也;只需使用容易出错的Observable.of(executeVerySlowMethod()),就可以更轻松地创建一个包含函数的observable。

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

应该可以解决executeVerySlowMethod()阻止//同步。

答案 1 :(得分:0)

这是一种新的实现方式:(RxJS6)

import { of, TimeoutError, throwError } from 'rxjs';
import { timeout, catchError } from 'rxjs/operators';

of(executeVerySlowMethod()).pipe(
   timeout(5000),
   catchError(err => {
      if (err instanceof TimeoutError) {
         throw new Error('timeout reached');
      }
      return throwError(err);
   }))