【问题标题】:angular 2 observable timeout second parameter typeangular 2 observable timeout 第二个参数类型
【发布时间】:2017-03-30 06:43:18
【问题描述】:

我目前正在尝试使 Angular 2 Observable 的 timeout() 方法正常工作,但是在所有教程中都有类似的代码,其中 timeout()的第二个参数> 方法是一个简单的错误:

return this.http.get('http://...')
                .timeout(2000, new Error('Timeout exceeded'));

但是当我复制这段代码时,TypeScript 说第二个参数的类型无效,并希望看到实现接口 IScheduler 的 smth。

解决问题的方法之一是创建实现 IScheduler 接口的新类,但它具有我不熟悉的功能 (now() 方法和 Tasks)。

有谁知道,我应该这样做还是有其他方法可以使事情正常进行?如果我想放置一些回调函数而不是错误怎么办?

【问题讨论】:

  • .timeout(2000, {errorToSend: new Error('Timeout exceeded')}); 呢?
  • @GünterZöchbauer,试过了,但它说 Argument of type '{ errorToSend: Error; }' 不可分配给“IScheduler”类型的参数。对象字面量只能指定已知属性,而 'ischeduler' 类型中不存在 'errorToSend'。 而在 ReactiveX github 中,他们 say 表示它不再接受此参数
  • 文档好像不是最新的。 github.com/ReactiveX/rxjs/blob/… 中不再有错误参数另请参阅github.com/ReactiveX/rxjs/blob/…

标签: angular http timeout observable


【解决方案1】:

timeout 不采用Error 作为参数。如果发生超时,它会抛出一个TimeoutError

如果你想抛出特定类型的错误,你可以使用timeoutWith operator 来做这样的事情:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/timeoutWith';

return this.http
  .get('http://...')
  .timeoutWith(2000, Observable.throw(new Error('Boom!')));

【讨论】:

  • 尝试了 0 秒超时但没有出现错误
  • 它工作得很好,对我来说(使用timeoutWith)。你确定你订阅了 observable 吗?没有订阅,什么都不会发生。
  • 是的,从this.http.get(...) 返回的 Observable 在服务中被订阅。如果我可以控制台日志而不是抛出错误,也许会更明显
  • 好吧,您还需要使用catch 运算符或将error 回调传递给subscribe 调用。否则,它将无法处理 - 并且应该显示在控制台中 - 仅此而已;没有什么棘手的。它适用于 Angular 2.4.10 和 RxJS 5.2.0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2019-11-25
相关资源
最近更新 更多