Angular 角度2-超时后取消订阅
如果API的响应太长,我想忽略它。我用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()
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)
可能会解决这个问题。