【发布时间】:2018-08-04 10:06:37
【问题描述】:
通常我总能找到解决我在 stackoverflow 上的问题的方法,你们真的很棒! 但是经过数小时的搜索后,我仍然遇到了这个问题:
我正在为 Chrome/FF 编写浏览器扩展程序,它通过 xhr post 方法将文件上传到服务器。如果服务器没有响应,我想给用户一个连接超时的反馈。因此,首先我使用了 10000 毫秒的超时值,因为我认为超时仅在请求/文件完全发送后才开始计数。然而,事实证明,在慢速连接上,上传时间超过 10 秒,并且在文件完全发送之前触发了超时事件。对于一些较大的文件,上传甚至需要几分钟,因此我不得不将超时值设置为 5 分钟。然而,这在快速连接上是不切实际的。在快速连接上,如果服务器没有响应,我不想在通知用户连接超时之前等待 5 分钟。
因此我正在寻找一个 xhr 解决方案,它应该:
- 首先将超时设置为例如在文件上传期间 5 分钟,以便在慢速连接时也能完全发送文件
- 将超时设置为例如文件完全发送后 10 秒,如果服务器在收到整个文件后 10 秒内没有响应,则连接超时。
有没有可能做到这一点?
编辑:到目前为止我尝试的是:
[...]
var originalTimeout = 10000;
xhr.timeout = originalTimeout;
[...]
xhr.upload.addEventListener('loadstart', function(e) {
xhr.timeout = 600000;
});
xhr.upload.addEventListener('loadend', function(e) {
xhr.timeout = originalTimeout;
});
我进行了几次上传测试,显然超时值被上传-'loadstart' 事件监听器更改为 600000,因为发送文件通常需要 10 秒以上,并且没有触发超时事件。但此后总是在文件完全发送到服务器后立即触发超时事件。我能够在服务器端确认文件已完全接收并且响应已发送。但是,由于之前触发了超时事件,因此脚本没有收到响应。
任何想法都会非常感激!
【问题讨论】:
标签: javascript asynchronous file-upload xmlhttprequest timeout