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
相关产品推荐
相关产品推荐

