如何从AWS内部回调函数获取结果数据?JS获取AppConfig数据遇阻
解决AWS AppConfig JavaScript异步获取配置的问题
问题根源
你之前的代码无法拿到预期值,核心原因是JavaScript异步操作的非阻塞特性:
startConfigurationSession是异步方法,调用后会立刻执行后续代码,不会等待回调函数完成,所以直接赋值给token的是方法的即时返回值(而非回调里的data)。- 回调函数里的
return无法把值传递到外层变量,因为回调是在异步操作完成后才执行的,此时外层代码已经执行完毕。
解决方案:用Async/Await简化异步流程
方法1:手动封装Promise(兼容所有场景)
把AWS SDK的回调式方法封装成返回Promise的函数,再用async/await按同步逻辑编写代码:
// 封装startConfigurationSession为Promise function startSession(params) { return new Promise((resolve, reject) => { appconfigdata.startConfigurationSession(params, (err, data) => { if (err) reject(err); else resolve(data.InitialConfigurationToken); }); }); } // 封装getLatestConfiguration为Promise function getConfig(token) { return new Promise((resolve, reject) => { appconfigdata.getLatestConfiguration({ ConfigurationToken: token }, (err, data) => { if (err) reject(err); else resolve(data.Configuration.toString()); }); }); } // 用async/await调用 async function fetchAppConfig() { try { const token = await startSession(params_develop); const configuration = await getConfig(token); // 这里可以直接使用configuration变量 console.log(configuration); return configuration; } catch (err) { console.error('获取配置失败:', err); throw err; } } // 执行函数 fetchAppConfig();
方法2:利用AWS SDK内置的Promise支持(更简洁)
AWS SDK v2及以上版本的方法可以通过.promise()直接转换为Promise,无需手动封装:
async function fetchAppConfig() { try { // 获取会话token const sessionData = await appconfigdata.startConfigurationSession(params_develop).promise(); const token = sessionData.InitialConfigurationToken; // 获取配置内容 const configData = await appconfigdata.getLatestConfiguration({ ConfigurationToken: token }).promise(); const configuration = configData.Configuration.toString(); console.log(configuration); return configuration; } catch (err) { console.error('获取AppConfig失败:', err); } } fetchAppConfig();
补充说明
- 和Python的差异:Python的异步逻辑依赖
asyncio,而JS早期依赖回调(易出现"回调地狱"),async/await是JS的语法糖,逻辑和Python的await一致,只是需要确保异步操作返回Promise。 - 使用
async函数的注意点:async函数本身返回的是Promise,如果要在其他地方使用返回的配置,需要用await或者.then():// 在另一个async函数中使用 async function main() { const config = await fetchAppConfig(); // 用config执行后续操作 } main(); // 或者用.then()链式调用 fetchAppConfig().then(config => { // 使用config }).catch(err => { // 处理错误 });
内容的提问来源于stack exchange,提问作者Lazyer
相关产品推荐
相关产品推荐

