【发布时间】:2018-02-01 09:40:21
【问题描述】:
我最近升级了我的 Angular 应用程序以使用 HttpClient 而不是 Http。在对标头和参数的处理进行了一些修复之后,我的大部分代码都能正常工作,但是一个特定的请求暗示我这是一种奇怪的行为。
该请求有点特殊,因为它是一个轮询请求,当它从服务器获取有效负载时会退出(它会返回 204 响应,直到它有东西要交付)。
我使用间隔 Observable 在特定的时间跨度内每秒轮询一次端点,当我获得有效负载时,我使用 .first() 运算符来处理数据。当我使用旧的 Http 服务时,这工作得很好。下面是它的外观:
return Observable.interval(this.pollInterval)
.mergeMap(() => this.http.get(this.apiUrl + '/poll'))
.first(data => data) // This is where the error occurs in HttpClient
.map(result => result)
.timeout(20000)
.catch(this.errorHandler);
当我使用已弃用的 Http 服务时,observable 可以正常工作,但是当我使用 HttpClient 服务时,我收到以下错误:
error TS2345: Argument of type '(data: Object) => Object' is not assignable to parameter of type '(value: Object, index: number, source: Observable<Object>) => boolean'. Type 'Object' is not assignable to type 'boolean'.
现在这里有点奇怪,我决定尝试通过在 .first() 运算符之前添加一个 .do(console.log) 来调试可观察流,如下所示:
return Observable.interval(this.pollInterval)
.mergeMap(() => this.http.get(this.apiUrl + '/poll'))
.do(console.log)
.first(data => data)
.map(result => result)
.timeout(20000)
.catch(this.errorHandler);
这样做似乎解决了问题,不再出现类型分配错误,并且所需的功能像以前一样工作。我已经使用了我在 .do() 运算符中调用的虚拟函数,但我不满意必须这样做来解决问题,所以我想弄清楚为什么会出现这种行为以及是什么.do() 运算符确实可以解决问题。
期待听到您对此问题的意见。
解决方案 我遵循了第一个答案的建议并使用了!在 .first() 返回中将数据类型转换为布尔值,这消除了类型错误并消除了使用问题中描述的 .do() 操作的需要。
【问题讨论】:
-
您不必在 GET 请求上使用
first()。
标签: angular rxjs rxjs5 angular-httpclient