Typescript Вернуться к списку обещаний - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь получить список идентификаторов учетных записей организации из нашей AWS учетной записи.

У меня есть следующий код

const acc_list: string[] = [];

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

console.log(acc_list)

, который регистрирует пустой список, потому что явно Команда консоли выполняется перед обещанием.

Моя цель - я хочу отправить список учетных записей другой функции (другому файлу) в моем приложении для машинописи. Понятия не имею, как это сделать.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Проблема в том, что созданная вами функция async () => { ... } на самом деле возвращает Promise, которую вам все еще нужно ждать. Таким образом, оборачивание асинхронного кода в такой asyn c 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);
});
0 голосов
/ 23 января 2020

Я бы посоветовал вам прочитать https://javascript.info/async-await

  • asyn c принимает функцию (....) -> T to (.... ) -> Promise
  • await принимает Promise to T, но только внутри асинхронной c функции

Если у вас возникли проблемы с асинхронностью / ожиданием, начните с использования Обещание 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))

Главное правило программирования с обещаниями заключается в том, что содержащиеся в них данные никогда не могут покинуть обещание. Так что попытка зафиксировать его в таком списке - это большое нет, нет. Худшее, что может случиться при этом, - это когда оно работает. Потому что нет никакого способа сказать, что может заставить его перестать работать, и если это случится через год, удачи в выяснении, почему он сломался или почему он работал в первую очередь.

...