优化Web性能:使用异步XHR与Fetch API获取文件修改时间

优化Web性能:使用异步XHR与Fetch API获取文件修改时间

本文详细介绍了如何将同步XMLHttpRequest请求转换为异步模式,以避免阻塞主线程并提升用户体验。通过XMLHttpRequest的事件监听机制和现代Fetch API,我们将展示如何高效、非阻塞地获取服务器端文件的最后修改时间,并实现页面根据文件状态自动刷新,同时提供示例代码和最佳实践。

1. 同步XMLHttpRequest的问题与危害

在web开发中,通过javascript与服务器进行数据交互是常见的需求。xmlhttprequest(xhr)是实现这一功能的核心api之一。然而,当xhr请求设置为同步模式(即req.open(“head”, url, false);中的第三个参数为false)时,它会阻塞浏览器的主线程,直到请求完成。这意味着在请求期间,用户界面将变得无响应,无法滚动、点击或执行任何其他操作,严重损害用户体验。现代浏览器普遍对此行为发出警告,并强烈建议避免在主线程中使用同步xhr。

原始的同步请求代码示例如下,它用于获取文件最后修改时间并计算其与当前时间的时间差:

                   var pageload = new Date();            function fetchHeader(url, wch) {                try {                    var req=new XMLHttpRequest();                    req.open("HEAD", url, false); // 同步请求,问题所在                    req.send(null);                    if(req.status== 200){                        return req.getResponseHeader(wch);                    }                    else return false;                } catch(er) {                    return er.message;                }            }            window.setInterval(function(){                var time = Date.parse(fetchHeader("Akut.txt",'Last-Modified'));                var d = new Date();                var diffSec = Math.round((d - time) / 1000);                document.getElementById("time").innerHTML = Math.trunc(diffSec/60) + " minutes"; // time since it was modified                if ((d-pageload)/1000 > 10 && diffSec < 5 ){                    location.reload();                }            }, 2500);        

尽管这段代码能实现功能,但其同步特性会导致页面卡顿,尤其是在网络条件不佳或请求频率较高时。浏览器控制台通常会给出类似“Synchronous XMLHttpRequest on the main thread is deprecated…”的警告。

2. 异步XMLHttpRequest的实现

要解决同步XHR带来的问题,核心在于将其转换为异步模式。异步请求不会阻塞主线程,而是通过回调函数或事件监听器在请求完成后通知我们。

2.1 异步XHR原理

异步XHR通过以下两种方式处理响应:

onreadystatechange 事件: 这是一个较旧但仍有效的方法。当readyState属性发生变化时触发,当readyState达到XMLHttpRequest.DONE(4)时,表示请求已完成。addEventListener(‘load’) 事件: 这是更推荐的现代方法,当XHR请求成功完成时触发。它更简洁,并且只关注请求成功的最终状态。

2.2 异步XHR代码示例

以下是将原同步XHR代码转换为异步的实现,它利用addEventListener(‘load’)来处理响应:

const pageload = new Date(); // 页面加载时间const url = "Akut.txt"; // 目标文件URLconst whichHeader = "Last-Modified"; // 要获取的响应头// 比较时间并更新UI的函数const compareTimeToNow = (time) => {  let d = new Date();  let diffSec = Math.round((d - time) / 1000);  document.getElementById("time").textContent = Math.trunc(diffSec / 60) + " minutes"; // 显示自修改以来的分钟数  // 如果页面加载超过10秒且文件在5秒内被修改过,则刷新页面  if ((d - pageload) / 1000 > 10 && diffSec  {  const req = new XMLHttpRequest();  req.addEventListener("load", reqListener); // 监听load事件  req.open("HEAD", url); // 异步请求,默认第三个参数为true  req.send();};// 首次调用以启动周期性检查getHeader();

代码解析:

req.open(“HEAD”, url);:第三个参数默认为true,表示异步请求。req.addEventListener(“load”, reqListener);:当请求成功加载时,reqListener函数会被调用。reqListener函数内部:通过this.getResponseHeader(whichHeader)获取所需的Last-Modified头信息,并将其转换为时间戳传递给compareTimeToNow函数。周期性检查:这里不再使用setInterval,而是采用setTimeout。在compareTimeToNow函数中,每次处理完数据后,如果不需要刷新页面,就调用setTimeout(getHeader, 2500)来调度下一次请求。这种模式可以确保前一个请求完全完成后才发起下一个请求,避免了请求重叠和资源竞争的问题,尤其适用于请求时间不确定的场景。

3. 使用Fetch API的现代方法

Fetch API是现代Web开发中进行网络请求的推荐方式,它基于Promise,提供了一种更强大、更灵活、更简洁的API来替代XMLHttpRequest。Fetch API的使用可以进一步简化代码,并提供更好的错误处理机制。

3.1 Fetch API的优势

基于Promise: 使得异步代码的编写更加直观,避免了回调地狱。更简洁的语法: 相较于XHR,Fetch API的链式调用使得代码更易读。更强大的功能: 支持更多HTTP特性,如CORS、流式响应等。

3.2 Fetch API代码示例

以下是使用Fetch API实现相同功能的代码:

const pageload = new Date(); // 页面加载时间const url = "Akut.txt"; // 目标文件URLconst whichHeader = "Last-Modified"; // 要获取的响应头// 比较时间并更新UI的函数(与XHR版本相同)const compareTimeToNow = (time) => {  let d = new Date();  let diffSec = Math.round((d - time) / 1000);  document.getElementById("time").textContent = Math.trunc(diffSec / 60) + " minutes"; // 显示自修改以来的分钟数  if ((d - pageload) / 1000 > 10 && diffSec  {  fetch(url, { method: 'HEAD' }) // 发起HEAD请求  .then(rsp => {    // 获取响应头,并转换为时间戳传递给compareTimeToNow    compareTimeToNow(new Date(rsp.headers.get(whichHeader)).getTime());  })  .catch(error => {    console.error("Fetch请求失败:", error);    // 失败后也应考虑是否继续调度下一次请求,例如延迟重试    setTimeout(getHeader, 5000); // 失败后延迟更久重试  });};// 首次调用以启动周期性检查getHeader();

代码解析:

fetch(url, { method: ‘HEAD’ }):发起一个HEAD请求。默认是GET请求,需要通过method选项指定。.then(rsp => { … }):当请求成功并接收到响应时,Promise会解析,并提供一个Response对象rsp。rsp.headers.get(whichHeader):通过Response对象的headers属性(一个Headers对象)来获取指定的响应头。.catch(error => { … }):用于捕获网络错误或请求失败的情况,提供了健壮的错误处理机制。

4. 注意事项与最佳实践

错误处理: 无论是XHR还是Fetch,都应加入适当的错误处理逻辑。对于XHR,可以在addEventListener(‘error’, handler)或addEventListener(‘abort’, handler)中处理;对于Fetch,使用.catch()方法捕获Promise的拒绝状态。周期性检查的优化:setTimeout vs setInterval: 在需要周期性执行异步操作时,通常推荐使用setTimeout递归调用自身,而不是setInterval。这是因为setInterval会不顾前一个任务是否完成就启动下一个任务,可能导致任务堆叠或资源耗尽。而setTimeout则确保了前一个任务完成后才调度下一个任务。动态间隔: 如果文件修改不频繁,可以考虑根据文件的修改频率动态调整检查间隔,或者在服务器端提供更高效的通知机制(如WebSocket或Server-Sent Events)。浏览器兼容性: Fetch API在现代浏览器中得到了广泛支持(Chrome 42+, Edge 14+, Safari 10.1+, Firefox 39+, Opera 29+),但不支持IE。如果需要兼容IE浏览器,则必须使用异步XMLHttpRequest。服务器负载: 频繁地向服务器发送HEAD请求,即使请求本身很轻量,也可能对服务器造成不必要的负载。在生产环境中,应仔细评估其影响。替代方案: 对于需要高实时性的场景,轮询(Polling)通常不是最佳选择。可以考虑以下替代方案:WebSockets: 提供全双工通信,服务器可以在文件修改时主动推送消息给客户端。Server-Sent Events (SSE): 允许服务器单向推送数据到客户端,适用于服务器事件驱动的更新。

总结

将同步XMLHttpRequest请求转换为异步模式是优化Web性能的关键一步,它能有效避免主线程阻塞,提升用户体验。通过XMLHttpRequest的事件监听器或更现代、更强大的Fetch API,我们可以轻松实现非阻塞的网络请求。在选择具体实现方式时,应根据项目需求、浏览器兼容性以及对代码简洁性的偏好进行权衡。同时,对于周期性任务,采用setTimeout递归调用而非setInterval,并结合适当的错误处理,是构建健壮Web应用的最佳实践。

以上就是优化Web性能:使用异步XHR与Fetch API获取文件修改时间的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1515632.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript异步请求:优化文件修改时间监控与页面刷新机制
上一篇 2025年12月20日 09:27:51
如何程序化创建和管理 FancyBox 5 模态框的内容
下一篇 2025年12月20日 09:28:01

相关推荐

  • 浅谈 Windows 桌面端触摸架构演进

    浅谈 Windows 桌面端触摸架构演进浅谈 Windows 桌面端触摸架构演进浅谈 Windows 桌面端触摸架构演进浅谈 Windows 桌面端触摸架构演进

    我在和小伙伴水触摸相关的坑,说到了上古的触摸,很难和小伙伴统一知识,于是就写了本文用于告诉大家,桌面端的触摸架构是如何一步步演进的 所有触摸架构都建立在系统之上,和系统版本相关。所以可以通过系统划分。虽然说是触摸架构,但是我能知道的也就是应用层面的接口和编程方法,如果是小伙伴被标题吸引过来的,想看触…

    2026年9月26日 • 用户投稿
    100
  • uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置

    uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置

    首先在UC浏览器设置中将新页面打开方式改为“当前窗口打开”,然后关闭分屏与多任务窗口功能,最后手动合并现有标签页,实现单窗口浏览。 如果您在使用UC浏览器时希望减少窗口切换的麻烦,提升浏览效率,可以通过设置将浏览器调整为单窗口模式。该模式下所有网页将在同一窗口中打开,避免产生多个标签页或窗口干扰操作…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置

    sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置

    首先安装Go环境并配置GOPATH、GOROOT和PATH,验证go version和go env;接着安装Sublime Text及其包管理工具Package Control;然后通过Ctrl+Shift+P安装GoSublime、GoFmt和SideBarGo插件;再进入GoSublime Pr…

    2026年9月26日 • 用户投稿
    200
  • linux必学常用命令有哪些

    linux必学常用命令有哪些linux必学常用命令有哪些linux必学常用命令有哪些linux必学常用命令有哪些

    Linux 入门必学的常用命令包括:文件与目录管理:列出、创建、移动、复制和删除文件与目录。文件内容操作:查看、逐页查看、搜索和按行显示文件内容。系统信息:查看系统版本、运行时间、磁盘和内存使用情况。用户与权限:显示当前用户、添加用户和组、更改密码。网络:测试连接、显示网络接口信息、查询 DNS 记…

    2026年9月26日 • 用户投稿
    000
  • 实现搜索结果按字母排序:PHP结合Ajax的专业教程

    本文档旨在提供一种使用PHP和Ajax对通过POST方法获取的搜索结果进行A-Z排序的解决方案。我们将创建一个表单,保存POST数据,并利用PHP函数对医生列表进行排序,最终通过Ajax实现无需刷新页面的排序功能。 1. 修改 search.php 文件 首先,我们需要在 search.php 文件…

    2026年9月26日
    000
  • 网易云音乐网页版在线播放网址 网易云音乐网页版官网登录入口

    网易云音乐网页版官网登录入口为https://music.163.com/,支持在线播放、MV搜索、歌单管理、电台收听及内容收藏分享等功能,界面简洁,适配多设备,涵盖新碟、榜单、独立音乐人及场景化音频内容。 网易云音乐网页版在线播放网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来网易云…

    2026年9月26日
    000
  • 悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程

    悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程

    使用悟空浏览器可将网页保存为图片:1. 通过菜单选择“长截屏”自动拼接完整页面;2. 利用分享功能调用系统截图工具生成图片;3. 将网页另存为HTML后借助第三方工具转换为图像格式。 如果您在浏览网页时希望将整个页面保存为图片以便分享或存档,但不确定如何操作,可以通过悟空浏览器的内置功能实现。以下是…

    2026年9月26日 • 用户投稿
    100
  • 操作指南:如何将抖音订单导入拼多多店铺

    操作指南:如何将抖音订单导入拼多多店铺操作指南:如何将抖音订单导入拼多多店铺操作指南:如何将抖音订单导入拼多多店铺操作指南:如何将抖音订单导入拼多多店铺

    为何要将抖音订单同步至拼多多店铺 作为国内领先的社交电商平台,拼多多拥有庞大的用户流量,与抖音的广泛受众高度契合。将抖音平台的订单数据导入拼多多店铺,已成为电商运营者提升效率的重要手段。此举不仅有助于增强店铺在多平台的曝光度,还能实现订单的集中化管理,提升整体运营效率。 具体操作步骤:从抖音导入订单…

    2026年9月26日 • 用户投稿
    000
  • NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场

    NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场NVIDIA仍占67% 5年后AMD能抢4%的AI显卡市场

    英伟达总市值逼近4.5万亿美元#英伟达 这两年来ai领域最大的赢家并非微软、谷歌或openai,而是nvidia。凭借在ai gpu领域的绝对主导地位,nvidia不仅实现了业绩的爆发式增长,更在近期将公司市值推向了约4.5万亿美元的历史新高。 在AI显卡市场,NVIDIA几乎处于垄断地位。尽管不同…

    2026年9月26日 • 用户投稿
    1100
  • 游戏模式优化:Windows11后台进程管理实测

    游戏模式优化:Windows11后台进程管理实测游戏模式优化:Windows11后台进程管理实测游戏模式优化:Windows11后台进程管理实测游戏模式优化:Windows11后台进程管理实测

    通过windows 11的游戏模式可以优化游戏性能,具体方法包括:1. 启用游戏模式自动调整系统资源;2. 通过后台进程管理限制资源消耗;3. 手动关闭不必要的后台进程;4. 确保驱动程序更新并注意游戏模式对其他应用的影响。 游戏模式优化可以通过调整Windows 11的后台进程管理来实现,这可以显…

    2026年9月26日 • 用户投稿
    200
  • CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch用于主线程等待其他线程完成操作,CyclicBarrier用于多线程相互等待至屏障点后集体执行,Semaphore用于控制并发访问资源的线程数量。 CountDownLatch, CyclicBarrier, Semaphore 都是并发编程中用于线程同步的工具,但它们的…

    2026年9月26日 • 用户投稿
    500
  • DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试

    DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试

    ddr5内存可以超频到6400mhz,但需要仔细调整和测试以确保稳定性。1.选择适合超频的ddr5内存条时,优先考虑芝奇幻锋戟系列,选择标有“oc”标签且规格接近目标频率的产品。2.在bios中将频率设为6400mhz,从宽松时序如cl36-36-36-76开始调整,并设定电压在1.25v到1.35…

    2026年9月26日 • 用户投稿
    000
  • 基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案

    基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案

    Quarkus通过GraalVM Native Image预编译实现启动时间低于0.5秒,需配置pom.xml插件、优化依赖、使用Quarkus CLI并监控调优。 Quarkus通过预编译和GraalVM Native Image等技术,让Java应用在云原生环境中拥有极低的启动时间和内存占用。本…

    2026年9月26日 • 用户投稿
    500
  • 如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程

    如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程

    使用WPS在线工具可直接上传PDF并转为Word,适合临时处理;2. WPS桌面版支持批量高精度转换,操作简便;3. 手机端WPS应用实现移动端快速转换与分享;4. 已打开PDF时可通过内置插件一键转为Word,提升效率。 如果您需要将PDF文件转换为可编辑的Word文档,WPS提供了便捷的转换功能…

    2026年9月26日 • 用户投稿
    000
  • qq浏览器安全吗会不会有病毒 QQ浏览器安全性与病毒风险评估

    qq浏览器安全吗会不会有病毒 QQ浏览器安全性与病毒风险评估qq浏览器安全吗会不会有病毒 QQ浏览器安全性与病毒风险评估qq浏览器安全吗会不会有病毒 QQ浏览器安全性与病毒风险评估qq浏览器安全吗会不会有病毒 QQ浏览器安全性与病毒风险评估

    QQ浏览器具备网址安全检测、云查杀和安全铭牌等防护功能,官方渠道下载的版本安全性高,自身携带病毒风险极低。其通过实时更新恶意网站数据库,对访问链接进行风险提示,并在下载时扫描文件安全性。用户应避免安装来源不明的插件,及时更新浏览器以修复漏洞。当出现安全警告时,应优先采信并核对网址真实性,可借助其他浏…

    2026年9月26日 • 用户投稿
    100
  • JavaAI实战:基于DeepLearning4j实现目标检测模型部署

    JavaAI实战:基于DeepLearning4j实现目标检测模型部署JavaAI实战:基于DeepLearning4j实现目标检测模型部署JavaAI实战:基于DeepLearning4j实现目标检测模型部署JavaAI实战:基于DeepLearning4j实现目标检测模型部署

    答案:在Java中通过DeepLearning4j部署目标检测模型需完成模型转换、数据预处理、推理执行和结果解析。首先利用KerasModelImport或ONNX将TensorFlow/Keras模型转为DL4J兼容格式,注意版本匹配与层兼容性;接着通过NativeImageLoader加载图像并…

    2026年9月26日 • 用户投稿
    600
  • 多模态输入的限制有哪些 输入内容类型与格式注意事项

    多模态输入的限制有哪些 输入内容类型与格式注意事项多模态输入的限制有哪些 输入内容类型与格式注意事项多模态输入的限制有哪些 输入内容类型与格式注意事项多模态输入的限制有哪些 输入内容类型与格式注意事项

    多模态输入是人工智能领域令人兴奋的发展方向,它赋予机器同时处理和理解多种信息类型的能力,例如将视觉、听觉与文本信息相结合。这项技术极大地扩展了人机交互的可能性。然而,如同任何新兴技术,多模态输入并非没有其固有挑战和局限性。了解这些限制以及如何恰当地准备输入内容,对于有效利用多模态系统的潜力至关重要。…

    2026年9月26日 • 用户投稿
    000
  • 多模态AI能否理解视频内容 视频处理能力分析与使用建议

    多模态AI能否理解视频内容 视频处理能力分析与使用建议多模态AI能否理解视频内容 视频处理能力分析与使用建议多模态AI能否理解视频内容 视频处理能力分析与使用建议多模态AI能否理解视频内容 视频处理能力分析与使用建议

    多模态AI处理视频是一个涉及多个数据流融合的技术领域。本文旨在探讨多模态AI如何理解视频内容,分析其当前的处理能力,并提供一些使用上的建议,帮助读者更好地认识和应用这项技术。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 多模态AI理解视频…

    2026年9月26日 • 用户投稿
    400
  • vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法

    vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法vivo浏览器如何设置电脑版UA_vivo浏览器切换电脑版网页标识方法

    可通过修改用户代理(UA)标识使vivo浏览器访问电脑版网页。首先尝试在设置中将UA标识切换为“Desktop”模式;若不支持,可手动输入电脑版UA字符串;还可安装UA切换插件实现一键切换,刷新页面后即可加载桌面版网站内容。 如果您在使用vivo浏览器时希望访问电脑版网页,但页面自动跳转至移动版,可…

    2026年9月26日 • 用户投稿
    400
  • 苹果最新的耳机是什么型号

    苹果最新的耳机是什么型号苹果最新的耳机是什么型号苹果最新的耳机是什么型号苹果最新的耳机是什么型号

    苹果于 2022 年 9 月发布了 AirPods Pro 2,其主要功能包括:改进的主动降噪 (ANC)自适应透明模式个性化空间音频触控控制H2 芯片提供更好的声音质量和更长的电池续航时间耐汗和防水 (IPX4)ANC 开启时可播放长达 6 小时,配合充电盒可播放长达 30 小时 苹果最新耳机型号…

    2026年9月26日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信