-1

我正在尝试从我们的 AWS 账户中获取组织账户 ID 的列表。

我有以下代码

const acc_list: string[] = [];

(async () => {
  const orgs = await aws.organizations.getOrganization();
  orgs.accounts.forEach(account => 
    acc_list.push(account.id))
})()

console.log(acc_list)

其中记录了一个空列表,因为显然控制台命令在承诺之前运行。

我的目标是我想将帐户列表发送到我的打字稿应用程序中的不同功能(不同文件)。不知道该怎么做。

4

2 回答 2

0

我建议您通读https://javascript.info/async-await

  • async 接受一个函数 (....) -> T to (....) -> Promise
  • await 接受一个对 T 的 Promise,但只在异步函数内部

如果您在使用 async/await 时遇到问题,请直接使用 promise api。

const accountIDs = (org) => orgs.accounts.map(account => (account.id))

const fetchAccountIDs = async () => accountIDs(await aws.organizations.getOrganization())

const promisedAccountIds = fetchAccountIDs()

promisedAccountIds.then(ids => console.log(ids))

使用 Promise 进行编程的最大规则是它们包含的数据永远不会离开 Promise。所以试图在这样的列表中捕获它是一个很大的禁忌。这样做可能发生的最糟糕的事情实际上是它起作用的时候。因为没有办法知道是什么可能导致它停止工作,如果一年后发生这种情况,那么祝你好运,弄清楚它为什么会坏或者为什么它首先会起作用。

于 2020-01-23T01:59:50.343 回答
0

问题是您创建的函数async () => { ... }实际上返回了一个Promise您仍然需要等待的函数。因此,将异步代码包装到这样的异步 lambda 中是没有意义的,因为代码块仍然是异步的。我可以向您推荐本教程

解决方案取决于问题上下文,可能整个块应该是异步的,例如:

async function printAccountIds() {
  const orgs = await aws.organizations.getOrganization();
  const accountIds = orgs.accounts.map(account => account.id);
  console.log(accountIds);
}

或者您可以只订阅承诺,例如:

aws.organizations.getOrganization().then(orgs => {
  const accountIds = orgs.accounts.map(account => account.id);
  console.log(accountIds);
});
于 2020-01-23T03:45:46.507 回答