You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jQuery的$.when().then()中结合条件执行不同数量AJAX请求

动态根据参数调整$.when中的AJAX请求数量

我明白你的需求啦——就是要在控制器初始化时,根据传入的参数决定发起3个还是4个AJAX请求,然后用$.when()统一等待所有请求完成对吧?其实核心思路就是动态构建AJAX请求的集合,再把这个集合传给$.when()就行,我给你整理个完整的实现方案:

实现步骤

  • 先定义初始化方法,接收控制请求数量的参数(比如叫includeExtraRequest)
  • 创建包含必选3个AJAX请求的数组
  • 如果参数为true,就把第4个请求追加到数组里
  • 最后用$.when()结合扩展运算符(或apply)处理请求数组,通过then()处理所有请求完成后的逻辑

完整代码示例

// 控制器初始化方法,接收控制参数
function initController(includeExtraRequest) {
  // 先定义必选的3个AJAX请求
  const ajaxRequests = [
    $.ajax({ url: "test.html" }).done(function() {
      $(this).addClass("done");
    }),
    $.ajax({ url: "test2.html" }).done(function() {
      $(this).addClass("done");
    }),
    $.ajax({ url: "test3.html" }).done(function() {
      $(this).addClass("done");
    })
  ];

  // 参数为true时,追加第4个请求
  if (includeExtraRequest) {
    ajaxRequests.push(
      $.ajax({ url: "test4.html" }).done(function() {
        $(this).addClass("done");
      })
    );
  }

  // 用$.when处理所有请求,...是ES6扩展运算符,把数组展开为单个参数
  $.when(...ajaxRequests)
    .then(function(testRes, test2Res, test3Res, test4Res) {
      // 所有请求成功完成后执行这里的逻辑
      // 注意:如果是3个请求,test4Res会是undefined,处理时要做判断
      console.log("所有请求完成");
      if (includeExtraRequest) {
        console.log("额外请求返回结果:", test4Res[0]);
      }
    })
    .fail(function(err) {
      // 任意一个请求失败时触发
      console.error("请求出错:", err);
    });
}

// 调用示例:传true发起4个请求,传false发起3个
initController(true);
// initController(false);

关键细节说明

  • 动态请求集合:用数组管理请求比硬写参数灵活太多,后续要增减请求直接操作数组就行
  • $.when参数传递:因为$.when()接收多个独立的Deferred对象,ES6用...扩展运算符展开数组;兼容ES5的话可以用$.when.apply($, ajaxRequests)
  • done回调的作用:你原来给每个AJAX加的done()是单独处理单个请求成功的逻辑,和then()的全局完成逻辑不冲突,可以保留
  • 结果顺序:then()的参数顺序和请求数组的顺序一致,参数为false时第4个参数会是undefined,处理时要注意判断

内容的提问来源于stack exchange,提问作者kostas.kapasakis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:40