如何修改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
相关产品推荐
相关产品推荐

