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

无法使用jQuery getJSON实现JavaScript Promise,求技术解决方案

修复你的JavaScript Promise实现问题

我来帮你梳理下这段Promise代码里的核心问题,再给出更合理的实现方式:

首先,你的代码存在几个关键问题:

  • 你创建的Promise没有调用resolve方法,这会导致这两个Promise永远停在pending状态,没办法用.then()或者await来获取异步请求的结果。
  • $.getJSON本身就已经返回一个Promise了,完全没必要手动再包裹一层new Promise,这属于冗余操作。
  • 代码最后一行的console.log(d...应该是笔误,应该是console.log(data)。

修正后的代码(保留1秒延迟需求)

如果你确实需要延迟1秒再发起请求,可以封装一个简单的延迟函数,结合$.getJSON返回的Promise来实现,不用手动构建Promise:

// 封装延迟函数,返回一个延迟指定时间后完成的Promise
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// 获取使用详情的Promise
const promiseToGetUsage = delay(1000).then(() => {
  return $.getJSON('../usageService/resources/webservice/getUsageDetails');
});

// 获取计算详情的Promise
const promiseToGetCompute = delay(1000).then(() => {
  return $.getJSON('../usageService/resources/webservice/getComputeDetails');
});

// 现在可以正常处理请求结果了
promiseToGetUsage.then(data => {
  console.log('使用详情:', data);
});

promiseToGetCompute.then(data => {
  console.log('计算详情:', data);
});

更简洁的版本(不需要延迟的话)

如果不需要那1秒的延迟,直接用$.getJSON返回的Promise就行,代码会清爽很多:

const promiseToGetUsage = $.getJSON('../usageService/resources/webservice/getUsageDetails');
const promiseToGetCompute = $.getJSON('../usageService/resources/webservice/getComputeDetails');

// 分别处理两个请求的结果
promiseToGetUsage.then(data => console.log('使用详情:', data));
promiseToGetCompute.then(data => console.log('计算详情:', data));

// 如果需要等待两个请求都完成后再统一操作,可以用Promise.all
Promise.all([promiseToGetUsage, promiseToGetCompute])
  .then(([usageData, computeData]) => {
    console.log('所有请求完成:', usageData, computeData);
  })
  .catch(error => {
    console.error('某个请求失败:', error);
  });

为什么你的原代码无法正常工作?

在你原代码里,new Promise的回调函数接收了resolve参数,但你从来没调用它。Promise的状态只有在调用resolve(或者reject处理错误)之后,才会从pending变成fulfilled(或rejected),这样后续的.then()才会触发。如果要强行修正原代码的写法(不推荐,因为冗余),需要补充调用resolve和错误处理:

// 仅作错误示例修正,不推荐实际使用
var promiseToGetUsage = new Promise(function(resolve, reject) {
  setTimeout(function() {
    $.getJSON('../usageService/resources/webservice/getUsageDetails', function(data) {
      console.log(data);
      resolve(data); // 必须调用resolve,Promise才会完成
    }).fail(error => {
      reject(error); // 处理请求失败的情况,避免错误被静默吃掉
    });
  }, 1000);
});

还是推荐前面更简洁的实现方式,避免不必要的Promise嵌套。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:17:26