无法使用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
相关产品推荐
相关产品推荐

