如何正确取消请求?

Posted

技术标签:

【中文标题】如何正确取消请求?【英文标题】:How to cancel a request properly? 【发布时间】:2018-04-19 08:34:55 【问题描述】:

假设我有一个服务向我的 API 发出 HTTP 请求并返回 observables - 通常情况。

我使用该服务,但用户不耐烦并决定使用 my-subscription.unsubscribe() 取消该请求。甚至有可能请求会使用 observable.timeout() 自行取消。

所以用户不会收到 API 的响应,但是 API 可能仍然收到了他的请求并处理了它,而没有注意到他。

httpclient中是否有方法可以让我取消一个HTTP请求,但确保取消后服务器不会收到请求?

就我而言,我有一个发布请求,可能需要不确定的时间。我需要能够取消请求,但如果用户取消请求,则不处理请求非常重要。另一种解决方案是处理请求,但通知用户即使他取消订阅,服务器也会处理它。

是否有可能在不使用 websockets 的情况下获得这种行为?

非常感谢。

【问题讨论】:

【参考方案1】:

httpclient 中是否有允许我取消 HTTP 的方法 请求,但要确保服务器不会收到请求 取消后?

unsubscribe 方法是取消已经发出的请求的正确方法。更多信息here。

但是,由于您说一旦开始请求将花费“不确定的时间”,因此您无法确定服务器在收到取消请求之前是否已经完成了对请求的处理。老实说,如果用户随后出于两个原因想要取消,我真的不明白如何保证 100% 不处理请求:

    您不知道处理请求需要多长时间 您不知道用户在要求取消之前要等待多长时间。

如果 (2) 在服务器完成后发生,那么您唯一的选择是您建议的替代方案,通知用户它已经处理了请求。

Websockets 也不会为您解决这个问题,因为它是时间问题之一。您可以做的是将请求放入队列中,以便服务器不会立即处理它。然后,您可以在服务器上设置一个计时器,以便它仅在某个固定时间(例如 10 分钟)后处理队列中的请求。这将允许用户有 10 分钟的宽限期,在此期间他们可以发送取消请求,然后您将其从队列中删除。

【讨论】:

以上是关于如何正确取消请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 4+ 中取消/取消订阅所有挂起的 HTTP 请求

如何正确取消订阅事件

如何取消 Ajax 请求? [复制]

如何在 AngularJS 中取消 $http 请求?

如何使用 RxAlamofire 取消先前的请求?

如何在 BeforeSendRequest 中取消请求