在Web开发中,前端经常需要同时向服务端发起若干个独立的AJAX请求,例如一边取用户资料,一边取订单记录,再一边取配置字典。只有当这些异步任务全部返回后,才适合把页面区块一次性画出来,否则就会出现数据错位或者临时空壳。jQuery提供的when方法正是为解决这种并行等待而设计的工具。

一、jQuery.when()的基本工作机制
jQuery.when()接收一个或多个延迟对象(Deferred或Promise),返回一个新的Promise。只有当传入的所有对象都进入已完成状态时,该Promise才会被解决;如果其中任意一个被拒绝,整体便会进入失败状态。它相当于把多条异步线拧成一股,对外只暴露一个统一的完成信号。
在实际代码里,我们通常用jQuery.ajax()去产生这些延迟对象,因为该方法本身返回的就是jqXHR,而jqXHR兼容Promise接口。把几个ajax调用直接塞进when的参数列表,就能轻松实现“等所有人到齐”的效果,而不必嵌套回调或者手动计数。
二、等待多个AJAX全部完成再渲染
假设页面需要展示三部分内容:用户昵称、最近订单、系统公告。我们可以分别发起请求,然后用when把它们包起来。在done回调中,三个响应的数据会按照传入顺序以参数形式提供,这时再统一操作DOM,就不会发生某块先出来、某块后出来的闪烁问题。
示例写法如下:
- var reqUser = $.ajax({url: '/api/user'});
- var reqOrder = $.ajax({url: '/api/order'});
- var reqNotice = $.ajax({url: '/api/notice'});
- $.when(reqUser, reqOrder, reqNotice).done(function(u, o, n){ 渲染用户(u[0]); 渲染订单(o[0]); 渲染公告(n[0]); });
这里每个回调参数都是一个类数组,其中第一项才是服务端返回的数据体。等三个请求真正全部成功,才执行渲染函数,UI一次性完整呈现,用户体验更平稳。
三、失败场景与容错处理
当任意一个AJAX失败时,when的整体Promise会走fail路线。若直接忽略失败,可能导致页面永远不渲染。我们可以用fail或者在done里判断状态来做降级,比如某一路断了就显示默认文案,其余正常画出来。
更细的控制可借助always与then。always无论成败都会跑,适合关闭loading动画;then能分别指定成功与失败的映射。下表列出常用回调的差异:
| 方法 | 触发条件 | 典型用途 |
|---|---|---|
| done | 全部成功 | 统一渲染正常UI |
| fail | 任一失败 | 提示错误、输出日志 |
| always | 无论成败 | 隐藏加载遮罩 |
四、结合UI渲染的最佳实践
先把页面置为加载态,例如显示“数据准备中”的占位。when启动后,在always里移除占位,在done里填充内容,在fail里展示重试按钮。这样用户始终知道当前处在什么阶段,也不会看到半成品界面。
如果请求数量动态变化,可以把它们先放进数组,再用apply调用:$.when.apply($, reqList)。渲染时遍历结果数组即可。这种写法在菜单权限、仪表盘多卡片等场景非常实用,既保持逻辑清晰,也避免层层嵌套带来的维护困难。
核心思路始终是:用when收口异步,用统一回调落盘视图,让界面只在数据齐备时出现。
jQuery_when异步AJAXUI渲染修改时间:2026-08-10 07:33:27