Как сохранить код синхронным, когда внутри циклов есть асинхронные вызовы - PullRequest
0 голосов
/ 08 февраля 2019

Я заполняю массив внутри цикла, и мне нужен полный массив, когда цикл заканчивается.

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

lambda.listFunctions({}).promise()
    .then((data) => {
        data.Functions.forEach(func => {
            lambda.listTags({ Resource: func.FunctionArn }).promise()
                .then((data) => {
                    if ("Edge" in data.Tags) {
                        available_functions.push(func.FunctionName)
                    }
                })
        });
          console.log(available_functions)
    })

available_functions всегда пусто, если я не сохраняю лог в конце каждого цикла foreach, а затем получаю его, возвращая 18 раз, что не то, что я хочу.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать Promise.all с вашей проблемой.См. Документацию по Promise.all () .

const available_functions = [];

lambda.listFunctions({}).promise()
    .then((data) => {
        const promises = []; // Collect promises

        data.Functions.forEach(func => {
            promises.push(lambda.listTags({ Resource: func.FunctionArn }).promise()
                .then((data) => {
                    available_functions.push(func.FunctionName)
                    return Promise.resolve(available_functions);
                })
            );
        });

        Promise.all(promises)
            .then(results => {
                    console.log(available_functions)
                // or
                    console.log(results[results.length - 1]);
            });
    });
0 голосов
/ 08 февраля 2019

Я полагаю, что вы можете просто пообещать, что это будет цепочкой, чтобы гарантировать, что все операции в рамках then завершаются, прежде чем идти вниз по цепочке.

lambda.listFunctions({}).promise()
  .then(data => {
    const { Functions } = data;

    // I converted this from forEach to for of
    for (const func of Functions) {
      lambda.listTags({ Resource: func.FunctionArn }).promise()
        .then(data => {
          if ("Edge" in data.Tags) {
            available_functions.push(func.FunctionName)
          }
        })
    }
  // also you can promise chain it if available_functions is within scope
  })
  .then(() => console.log(available_functions))

Или более чистый async await способбудет выглядеть примерно так ...

async fn() {
  const available_functions = [];

  const { Functions } = await lambda.listFunctions({}).promise();

  for (const func of Functions) {
    const tags = await lambda.listTags({ Resource: func.FunctionArn }).promise();

    if ("Edge" in tags) {
      available_functions.push(func.FunctionName)
    }

  }

  return available_functions

}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...