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

如何通过await获取Promise的已解析数据,解决await仅在async函数可用报错

问题根因

  1. getCPUUsage返回值是Promise对象,你直接同步调用时异步逻辑还未执行完成,所以打印结果为Promise { <pending> }。
  2. await语法仅支持在标记了async的函数内部使用,或Node.js v14.8+的ESM模块顶层使用,普通同步上下文直接写await会触发语法错误。
  3. 你提供的原代码存在两处逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:45:07