Angular 角度2-超时后取消订阅

Angular 角度2-超时后取消订阅,angular,http,typescript,angular2-services,Angular,Http,Typescript,Angular2 Services,如果API的响应太长,我想忽略它。我用 this.http.get(mysqlUrl).subscribe() 为了得到回应。但我想取消订阅,如果它需要超过5秒才能完成。我知道我可以使用unsubscribe(),但如何将其链接到超时值 谢谢 普通的setTimeout应该可以工作: let subscription = this.http.get(mysqlUrl).subscribe(...); setTimeout(() => subscription.unsubscribe()

如果API的响应太长,我想忽略它。我用

this.http.get(mysqlUrl).subscribe()
为了得到回应。但我想取消订阅,如果它需要超过5秒才能完成。我知道我可以使用unsubscribe(),但如何将其链接到超时值


谢谢

普通的
setTimeout
应该可以工作:

let subscription = this.http.get(mysqlUrl).subscribe(...);

setTimeout(() => subscription.unsubscribe(), 5000);

您可以使用takeUntil运算符:

this.http.get(mysqlUrl)
    .takeUntil(Observable.of(true).delay(5000))
    .subscribe(...)

import'rxjs/add/operator/timeout

this.http.get(mysqlUrl)
    .timeout(5000)
    .subscribe()

我自己也经常使用setTimeout(),但趋势似乎是不要将setTimeout与Angular一起使用(至少,AngularJS有$timeout服务)…我认为人们不喜欢将
setTimeout
用作黑客。但在这种特殊情况下,您实际上需要等待超时。同样,角度2个补丁的功能类似于<代码> SETTIMEOUT,所以它的行为类似于角1中的代码> $TimeOuts/CODE >。这里也提到了Frank Modica提供的解决方案,所以我认为这是正确的解决方案。我更多地使用<代码> RXJS < /代码>,我更喜欢这个答案,因为您不必将订阅存储在变量中。我只是不喜欢做
导入'rxjs/add/operator/takeUntil';导入“rxjs/add/observable/of”;导入“rxjs/add/operator/delay”
。但是如果我管理很多订阅,我可能会使用这个解决方案。对我来说,takeUntil在5秒钟后不会停止。我的场景涉及使用clickstream和switchmap,clickstream意味着如果在第一次完成之前再次单击,我希望取消任何正在进行的请求。如果您有一个成功的订阅-ie响应返回,在5秒钟之前,您的错误处理也会在5秒钟之后开始,所以我不太喜欢这种方法。令人遗憾的是,成功的订阅并没有自动结束超时,就这样…
。take(1)
可能会解决这个问题。