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

Node.js环境下如何打印promise变量结果并将其赋值给变量

问题原因与解决方法

1. 核心问题:Promise未触发状态变更

你当前编写的Promise实例中,exec的回调拿到执行结果后,从来没有调用resolve()或者reject()改变Promise的状态,因此这个Promise会一直处于pending(等待中)状态,外部调用时永远拿不到返回结果,也无法触发后续的处理逻辑。

2. 修复代码:补充resolve/reject逻辑

const { exec } = require('child_process'); // 注意提前引入exec模块

function getMetricFilters() {
  return new Promise(function(resolve, reject) {
    exec("aws cloudwatch list-metrics --namespace AWS/ApiGateway  | jq -r .Metrics[].Dimensions[].Name | sort -u", (error, stdout, stderr) => {
      if (error) {
        console.error(`error: ${error.message}`);
        return reject(error); // 执行出错时调用reject抛出错误
      }
      if (stderr) {
        console.log(`stderr: ${stderr}`);
        return reject(new Error(stderr)); // 标准错误输出按错误场景处理
      }
      console.log(`stdout: ${stdout}`);
      return resolve(stdout); // 正常拿到结果时调用resolve传递返回值
    })
  })
}

3. 获取Promise结果的两种方式

方式1:使用.then().catch()链式调用

getMetricFilters()
  .then(result => {
    console.log('Promise返回的结果:', result);
    // 依赖result的后续逻辑都要写在这个回调内,也可以在这里把result赋值给外层变量
  })
  .catch(err => {
    console.error('调用出错:', err);
  })

方式2:使用async/await语法(写法更简洁)

如果是在async函数内部,可以用await直接获取结果赋值给变量:

async function main() {
  try {
    const metricResult = await getMetricFilters();
    console.log('拿到的结果:', metricResult);
    // 依赖metricResult的后续逻辑都写在这里即可
  } catch (err) {
    console.error('调用出错:', err);
  }
}

// 执行入口函数
main();

注意事项

  • Promise是异步对象,不能在同步代码中直接拿到Promise的返回值,所有依赖结果的逻辑必须写在.then回调内,或者await后面的async函数作用域内。
  • 你之前不封装能拿到stdout是因为逻辑直接写在exec的回调里,回调会在exec执行完成后自动触发,封装成Promise后必须通过resolve把结果传递到外层才能正常获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:45:03