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

如何修改getJSON代码实现RESTful API请求并行而非串行?

优化并行API请求的实现方案

当然没问题!你当前的代码是通过$.each循环逐个发起API请求——虽然$.getJSON是异步的,但循环本身是同步执行的,实际请求会被依次触发,没法做到真正的并行。我们可以用Promise.all()来让所有请求同时发起,大幅提升加载效率。

优化后的代码示例

$(function(){ 
  const env = [ 'dev1', 'dev2', 'qa1', 'qa2', 'stage1' ]; 

  // 生成所有并行请求的Promise数组
  const requestPromises = env.map(envItem => {
    const apiUrl = `/api/testing/${envItem}`;
    // 发起请求后,返回包含环境标识和结果的对象,方便后续DOM更新
    return $.getJSON(apiUrl).then(apiResult => ({ 
      env: envItem, 
      data: apiResult 
    }));
  });

  // 等待所有请求完成(全部成功才进入then,任意失败进入catch)
  Promise.all(requestPromises)
    .then(allResults => {
      // 批量处理所有请求结果,更新DOM
      allResults.forEach(({ env, data }) => {
        const targetElement = $(`#database .${env}`);
        if (data.date === 'null') {
          targetElement.text('N/A');
        } else {
          // 补全你原本的moment格式,比如YYYY-MM-DD HH:mm:ss
          targetElement.text(moment(data.date).format('YYYY-MM-DD'));
        }
      });
    })
    .catch(error => {
      // 统一处理请求失败的情况
      console.error('请求过程中出现错误:', error);
      // 你可以在这里添加自定义错误处理,比如给用户提示或标记失败的环境
    });
});

优化点说明

  • 并行发起请求:通过env.map一次性生成所有请求的Promise,Promise.all()会同时触发所有请求,无需等待前一个请求完成,总耗时接近单个请求的最长耗时,而非所有请求耗时之和。
  • 清晰的结果关联:每个请求的Promise在完成后返回包含环境标识和接口结果的对象,避免后续处理时混淆不同环境的数据。
  • 统一错误处理:原来的代码没有处理请求失败的情况,现在可以在catch块中统一捕获任意请求的错误,做集中处理。

可选:允许部分请求失败的场景

如果希望某个请求失败时不影响其他请求的结果处理,可以用Promise.allSettled()代替Promise.all(),它会等待所有请求完成(无论成功或失败):

// 先调整requestPromises的生成逻辑,确保错误也携带环境标识
const requestPromises = env.map(envItem => {
  const apiUrl = `/api/testing/${envItem}`;
  return $.getJSON(apiUrl)
    .then(apiResult => ({ env: envItem, data: apiResult, success: true }))
    .catch(() => ({ env: envItem, success: false }));
});

// 使用allSettled处理所有结果
Promise.allSettled(requestPromises)
  .then(allResults => {
    allResults.forEach(result => {
      const { env, success } = result.value;
      const targetElement = $(`#database .${env}`);
      if (success) {
        const { data } = result.value;
        if (data.date === 'null') {
          targetElement.text('N/A');
        } else {
          targetElement.text(moment(data.date).format('YYYY-MM-DD'));
        }
      } else {
        targetElement.text('请求失败');
      }
    });
  });

内容的提问来源于stack exchange,提问作者user6605797

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:54