首页 文章 精选 留言 我的

精选列表

搜索[JavaScript],共9118篇文章
优秀的个人博客,低调大师

JavaScript 中的 AbortController:如何优雅地取消 fetch 与异步任务

在开发中我们经常遇到这样的场景:用户快速切换页面,但之前的接口请求还在进行;搜索框连续输入时,每敲一个字符就发一次请求,旧请求的结果可能覆盖新结果;或者文件上传过程中用户点击了取消按钮。这些情况如果不做处理,轻则浪费带宽和服务器资源,重则导致界面状态混乱。过去我们常用一个布尔标记或 XMLHttpRequest 的 abort 方法来中断请求,但代码零散且难以复用于 Promise 链。AbortController 是现代浏览器提供的标准 API,它让取消操作变得统一且可组合。这篇文章会从实际代码出发,讲清楚 AbortController 的基本用法、如何配合 fetch 取消请求、如何处理多个请求共用一个信号、以及它在非 fetch 异步任务中的巧妙应用。

优秀的个人博客,低调大师

JavaScript 事件循环里微任务和渲染帧的真实关系

先明确一个容易混的点:浏览器的主线程同一时间只能做一件事,事件循环负责调度任务。规范把任务分成 task 和 microtask,task 来自不同的 task source(比如用户交互、网络、定时器),每个 task source 有自己的队列。每一轮循环只从某个 task 队列里取一个 task 执行,执行完后执行 microtask checkpoint,即把微任务队列清空。清空之后,浏览器会判断是否需要 render,需要的话就走样式计算、布局、绘制、合成。render 不是 task,它发生在当前 task 和微任务都处理完之后。

优秀的个人博客,低调大师

JavaScript 中如何正确中断 Promise 链式调用并清理副作用

调用多个接口时经常遇到一个场景:用户快速切换筛选条件,或者组件在请求返回前被卸载。如果每个 then 都顺序执行,旧的请求结果可能会覆盖新状态,或者在组件卸载后触发 setState 报警告。更麻烦的是,有些 Promise 链中间还会写缓存、上报日志、改全局变量,一旦开始执行就很难从外部停下来。原生 Promise 本身没有 cancel 方法,早期 Bluebird 虽然提供过 cancel,但标准方案一直没落地。实际项目中只能靠 AbortController、标志位、或者把链式调用改写成 async 函数配合判断来绕开。这篇文章从一次真实的数据看板翻页问题出发,讲清楚 Promise 链为什么不能直接中断,以及几种在业务代码里可用的方案和它们各自的边界。

优秀的个人博客,低调大师

如何使用JavaScript实现在线Excel附件的上传与下载?

前言 在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单元格的形式来显示,今天小编将为大家介绍使用前端HTML+JS+CSS技术通过超链接单元格的形式实现在线Excel附件上传、下载和修改的操作。 使用JS实现附件上传 实现的方式分为四个步骤: 1.创建前端页面 2编写暂存附件信息的方法 3.编写附件文件清除的方法 4.编写文件保存和文件加载的方法 1.创建前端页面 核心代码: <div style="margin-bottom: 8px"> <button id="uploadAttach">上传附件</button> <button id="removeAttach">清除附件</button> <button id="fileSaver">文件保存</button> <button id="loadSubmitFile">加载文件</button> <button id="loadPackage">打包下载</button> </div> <div id="fileOperate" style="visibility: hidden;position: absolute;top: 100px;left: 300px;z-index: 10; background-color: #eee;padding: 16px"> <label for="choseFile">选择文件\</label> <input type="file" id="choseFile" name="choseFile"/> <button id="submit">提交</button> <button id="cancel">取消</button> </div> 点击上传附件按钮可以把附件上传到对应的单元格,清除附件会清理掉所有已经上传过的附件信息,打包下载会对所有的附件进行统一下载。 2.暂存附件信息方法 这一步起始主要用来设置文件上传之后单元格超链接及tag信息。细心的同学会注意到,这里我注册了一个命令,超链接本身会有一个跳转的行为,写command之后,会阻止这个默认跳转,转去执行对应的命令。注册的命令主要就是用来做附件文件的下载。 核心代码: function hasAttachFile(sheet,row,col,file){ \*\* \* 附件文件暂存 \* 这里由于没有服务端,所以我直接存了File对象,但File对象只有在实际使用时才会去获取实际的文件内容。在demo中可行 \* 在实际项目中,需要将file对象上传到文件服务器中 \* 上传完成后tag中的fileInfo应该代表的是文件的访问地址,而不能再是File对象。 \* sheet.setValue(row,col,file.name) sheet.setTag(row,col,{ type: hyerlinkType, fileInfo: file // 实际项目中fileInfo应该为上传完成文件的访问路径 }) sheet.setHyperlink(row, col, { url: file.name, linkColor: '#0066cc', visitedLinkColor: '#3399ff', drawUnderline: true, command:'downloadAttachFile', }, GC.Spread.Sheets.SheetArea.viewport); } 在这里,我引入了三方组件库FileSaver,在点击超链接单元格时,可以支持当前附件文件的下载。 // 下载文件 spread.commandManager().register("downloadAttachFile",{ canUndo: false, execute: function(context,options,isUndo){ let sheet = context.getActiveSheet() let row = sheet.getActiveRowIndex() let col = sheet.getActiveColumnIndex() let cellTag = sheet.getTag(row,col) console.log(sheet,row,col,cellTag) if(cellTag && cellTag.type==hyerlinkType){ \*\*\* \* 纯前端demo,文件存在于本地,fileInfo中存储的是File对象,可以直接获取到文件 \* 实际项目中,fileInfo应该是上传到文件服务器上的文件访问地址。 \* 因此这里需要发送请求,先获取文件blob,将获取的blob传递到saveAs的第二个参数中。 \* saveAs(cellTag.fileInfo,cellTag.fileInfo.name) } } }) 附件文件清除 document.getElementById("removeAttach").onclick = function(){ \*\*\* \* 清除附件 \* 清除附件需要先删除远程文件服务器的文件,之后清除单元格的Tag信息。 \* 这里前端演示demo,只删除了tag。 \* 实际项目中tag中的fileInfo应该是文件上传后的路径 \* let sheet = spread.getActiveSheet() let row = sheet.getActiveRowIndex() let col = sheet.getActiveColumnIndex() spread.commandManager().execute({ cmd:"removeAttachFile", sheet,row,col }) } 文件保存/加载 将文件保存成为JSON结构: document.getElementById("fileSaver").onclick = function(){ // 保存文件 submitFile = spread.toJSON() spread.clearSheets() spread.addSheet(0) } 加载已保存文件: document.getElementById("loadSubmitFile").onclick = function(){ // 加载已保存文件 spread.fromJSON(submitFile) } 实现功能和效果: 在需要在某个单元格中上传附件时,我们可以弹出一个模态框,在模态框中上传文件,点击提交之后,可以对文件做一个暂存,将文件信息存储在单元格的Tag中,点击单元格可以下载文件。 完整代码和在线Demo地址: https://jscodemine.grapecity.com/share/VHlpNyuP-0CIBNleP5jtyA/ 扩展链接: Spring Boot框架下实现Excel服务端导入导出 项目实战:在线报价采购系统(React +SpreadJS+Echarts) Svelte 框架结合 SpreadJS 实现纯前端类 Excel 在线报表设计

优秀的个人博客,低调大师

Bun v1.0.2 发布,Zig 编写的 JavaScript 运行时

Bun 上周发布了 1.0 正式版,标志着这个由前 Facebook 工程师创建的项目正式进入稳定生产可用阶段。 在过去的一周里,开发团队积极修复错误,现在已经发布了第 2 个补丁更新:Bun v1.0.2。 此版本修复了许多错误,以及提升bun --watch速度。 其他变化 修复 bunx @latest cache 错误 针对 Bun.serve(), node:stream, node:readline, node:tty, transpiller 的错误修复 修复 bun run 错误 修复 fastify 错误 Concurrent node:fs v8 date parser urlSearchParams.size, URL.canParse 详情

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册