NodeJS如何获取stepfunctions.listExecutions内部设置的外部变量值
问题解决方案
问题根源
你遇到的不是无法给全局变量赋值的问题,是Node.js 异步 I/O 执行顺序导致的:
stepfunctions.listExecutions和内部的stepfunctions.describeExecution都是异步方法,JS 不会等待它们的回调执行完成再往下走,会先执行你写在外层的console.log('isSuccess: ' +isSuccess),此时回调还没触发,isSuccess还没被赋值,自然返回 undefined。- 你用
forEach遍历执行异步的describeExecution时,也没有机制等待所有异步请求执行完成,就算你把 console 写在 listExecutions 回调的末尾,依然早于所有 describeExecution 回调的执行时间。
修复方案
推荐用 async/await 语法改写异步逻辑,避免嵌套回调,同时通过 Promise.all 等待所有异步请求执行完成后再读取 isSuccess 的值,代码示例如下:
const AWS = require('aws-sdk'); const stepfunctions = new AWS.StepFunctions({ region: process.env.AWS_REGION }); const params = { stateMachineArn: 'arn:aws:states:us-west-1:121:stateMachine:test', maxResults: '2', nextToken: null, statusFilter: 'SUCCEEDED' }; // 用async函数包裹异步逻辑 async function checkExecutionSuccess() { let isSuccess = false; try { // promise化调用listExecutions,等待返回结果 const listRes = await stepfunctions.listExecutions(params).promise(); // 生成所有describeExecution的promise数组 const describePromises = listRes.executions.map(result => { const describeParams = { executionArn: result.executionArn }; return stepfunctions.describeExecution(describeParams).promise(); }); // 等待所有describe请求执行完成 await Promise.all(describePromises); // 所有请求无报错的话就标记为成功 isSuccess = true; } catch (err) { console.log(err, err.stack); } // 这时候再读取isSuccess才是最终值 console.log('isSuccess:', isSuccess); return isSuccess; } // 执行函数 checkExecutionSuccess();
效果说明
改写后会等待所有 Step Functions 接口请求全部执行完成后才会打印 isSuccess 的值,就能得到你预期的 true 输出。如果你需要在其他地方使用这个值,从 checkExecutionSuccess 函数返回的 Promise 中读取即可。
内容的提问来源于stack exchange,提问作者Dave Brady
相关产品推荐
相关产品推荐

