如何通过await获取Promise的已解析数据,解决await仅在async函数可用报错
问题根因
getCPUUsage返回值是Promise对象,你直接同步调用时异步逻辑还未执行完成,所以打印结果为Promise { <pending> }。await语法仅支持在标记了async的函数内部使用,或Node.js v14.8+的ESM模块顶层使用,普通同步上下文直接写await会触发语法错误。- 你提供的原代码存在两处逻辑错误:
wait函数内setTimeout参数顺序写反、percentageCPU未声明就使用,会导致最终无法返回正确结果。
修复后完整实现
先修改getCPUUsage的逻辑错误:
const os = require("os"); // 获取CPU平均耗时 function cpuAverage() { let totalIdle = 0, totalTick = 0; let cpus = os.cpus(); for(let i = 0, len = cpus.length; i < len; i++) { let cpu = cpus[i]; for(type in cpu.times) { totalTick += cpu.times[type]; } totalIdle += cpu.times.idle; } return {idle: totalIdle / cpus.length, total: totalTick / cpus.length}; } // 修复后的CPU使用率获取函数 function getCPUUsage() { return new Promise((resolve, reject) => { let data = {avg : 0} try { let startMeasure = cpuAverage(); // 修复wait函数的参数错误 const wait = ms => new Promise(resolve => setTimeout(() =>{ let endMeasure = cpuAverage(); let idleDifference = endMeasure.idle - startMeasure.idle; let totalDifference = endMeasure.total - startMeasure.total; // 补全变量声明 let percentageCPU = 100 - ~~(100 * idleDifference / totalDifference); resolve(percentageCPU); }, ms)); wait(100).then(percentageCPU => { console.log(percentageCPU + "% CPU Usage."); data.avg = percentageCPU resolve(data) }) } catch (e) { console.log('getCPUUsage error:', e); resolve(false); } }) }
两种正确获取结果的方式
方式1:使用.then()链式调用(无需适配async上下文,兼容性最好)
所有需要用到result的逻辑都要放在then的回调函数内:
let result = {} getCPUUsage().then(cpuData => { result = cpuData // 后续操作result的逻辑写在这里 console.log('getCPUUsage()>>', result) // 输出格式:{avg: xx} })
方式2:使用async自执行函数 + await(写法更简洁,符合同步阅读习惯)
let result = {} // 用匿名async函数自执行包裹await逻辑 ;(async () => { result = await getCPUUsage() // 后续操作result的逻辑写在这里 console.log('getCPUUsage()>>', result) })()
如果你的项目是ESM模块(package.json中配置了"type": "module"),且Node.js版本≥14.8,可直接使用顶层await:
const result = await getCPUUsage() console.log('getCPUUsage()>>', result)
内容的提问来源于stack exchange,提问作者niddddddfier
相关产品推荐
相关产品推荐

