使用此http.get方法不能超过2分钟的超时时间。

11

我的Angular 4.3.2代碼正在調用後端服務,該服務需要2-4分鐘才能返回。使用默認的this.http.get代碼,我發現默認超時在2分鐘後啟動。但是當我嘗試設置超時時間為2分鐘以上時,它失敗了,因為它永遠不會讓超時時間超過2分鐘。

我嘗試了100、100000(1.7分鐘)和114000(1.9分鐘),這些都可以正常工作,因為它們在那些值時被超時。但是當我嘗試126000(2.1分鐘)、180000(3分鐘)和1800000(30分鐘)時,再次看到它在2分鐘後超時。

this.http.get('myUrl')
.timeout(126000)
.map((res: Response) => this.convertResponse(res));

我也尝试过使用.timeoutWith(126000, Observable.throw(new Error("Timed out"))),但没有成功。


你能否通过httpClient将服务器调用的超时时间增加到2分钟以上? 我也在处理类似的情况,其中一个服务器调用需要超过2分钟才能响应,但使用this.http.get('url').timeout(180000)并没有起作用。 - dev
它发生在你的开发机器上吗?如果是这样,你是否正在使用代理配置 - Marcos Dimitrio
2个回答

15

你不能更改Web浏览器的网络超时设置来处理HTTP请求。当计时器到达时,timeout()操作符会抛出JavaScript错误,但这与通信的网络超时无关。

例如:我可以在任何可观察对象上使用timeout()操作符。

of("hello").pipe(delay(5000), timeout(1000));

以上操作将在1秒后超时。

我的Angular 4.3.2代码正在调用我的后端服务,该服务需要2-4分钟才能返回。

服务器必须在2-4分钟的持续时间内传输HTTP标头和部分正文。这是为了继续HTTP连接,客户端无法保持连接活动。

对于HTTP请求而言,不快速完成是一种不好的做法。

您可以要求服务器启动任务,然后按间隔轮询以查看任务是否完成,或者您可以使用WebSockets与服务器通信并保持连接直到完成。

两种方法都是广泛的主题,我不能提供更多详细信息。


同意。已知在服务器上需要长时间运行的任务应该立即从初始请求返回某种类型的任务ID,然后应在客户端和服务器上实现逻辑以允许定期轮询结果。或者您可以变得更加高级,并通过WebSockets实现某种异步事件传递来交付结果。 - reads0520
我刚刚遇到了这个问题,同时发现浏览器出现了一个奇怪的问题。有一个名为api.xyz.com/image/upload的发布API。当我从abc.xyz.com调用此API时,浏览器在2分钟后终止了连接并返回失败响应;而当我从def.xyz.com调用相同的后端API时,在2.4分钟后取得了成功,并且浏览器一直等待2.4分钟。 abc.xyz.com和def.xyz.com的代码是相同的。 - Sudhanshu Srivastava
@reactgular,所以我们不能等待超过2分钟的Api调用吗? - Amir

1

我认为这不是浏览器网络超时的问题,因为我可以使用jQuery.ajax()进行更长时间的请求,甚至从后端不传输HTTP头或部分体,请求仍然保持活动状态。

在评论中我没有收到你的回复,但是我在我的开发机上遇到了完全相同的问题。我使用了代理配置,代理的默认超时时间是120秒(2分钟)。如果你的情况也是如此,那么你只需要在配置中定义一个更高的值即可。

{
  "/api": {
    "target": "http://localhost:3000",
    "secure": false,
    "timeout": 360000
  }
}

但我同意@Reactgular的观点,在大多数情况下,您希望HTTP请求能够快速返回。


3
在本地设置中可能有效,但实际环境如何呢?就我而言,UI代码是作为Java应用程序的一部分进行部署的,并且请求在30秒内超时。在本地环境中,我可以无限期地保持它。 - Sandeep Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接