Как мне убедиться, что лямбда-функция ожидает вызова асинхронной функции с await?

#node.js #async-await #aws-lambda #es6-promise #aws-codecommit

#node.js #async-await #aws-lambda #es6-обещание #aws-codecommit

Вопрос:

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

Я попытался переписать функцию, которая обертывает createCommit, чтобы просто использовать promises, но, похоже, это тоже не работает. Мне интересно, есть ли какая-то особенность lambda, о которой я не знаю, или я неправильно использую async / await (я только недавно узнал, как их использовать)

это мой основной обработчик событий lambda:

 exports.handler = async (event) => {
   const [file, lastCommitId] = await Promise.all([getFile(event), getLastCommitId()]);

   return await createCommit(file, lastCommitId)
      .then(result => returnResponse(result, 200))
      .catch(err => returnResponse(err, 500));
};
  

это моя функция-оболочка для createCommit

 
async function createCommit(file, parentCommitId) {
   const fileContent = await file.content.toString('base64');

   const params = {
      "authorName": "admin",
      branchName,
      "commitMessage": "add image",
      "email": "n/a",
      "parentCommitId": parentCommitId,
      "putFiles": [
         {
            fileContent,
            "fileMode": "NORMAL",
            "filePath": `src/images/${file.filename}`
         }
      ],
      repositoryName
   };

   console.log("creating commit against last commit id "   parentCommitId);

   const result = await codecommit.createCommit(params).promise();

   console.log(JSON.stringify(result));
   return resu<
}
  

Я ожидаю, что лямбда-функция будет ждать завершения вызова createCommit, но она просто распечатывает консоль.журнал, начинающийся с «создание фиксации по последней фиксации …» и завершается.

Ответ №1:

Вы не должны использовать await и .then вместе. измените свой код на и trycatch , если вы хотите перехватить исключение или неудачный случай.

 exports.handler = async (event) => {
   const [file, lastCommitId] = await Promise.all([getFile(event), getLastCommitId()]);

   return await createCommit(file, lastCommitId);
};
  

Смотрите приведенный ниже пример, чтобы лучше понять результат.

 function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds().then(x=>console.log('inside then ', x));
  console.log('after await ',result);
}

asyncCall();  

и без out then

 function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  console.log('after await ',result);
}

asyncCall();  

Комментарии:

1. Пожалуйста, примите это как ответ, если это решит вашу проблему

2. Я удалил . тогда, как вы сказали, но функция все равно завершается, прежде чем дождаться завершения вызова javascript exports.handler = async (event) => { const [file, lastCommitId] = await Promise.all([getFile(event), getLastCommitId()]); return await createCommit(file, lastCommitId); };

3. смотрите const result = await codecommit.createCommit(params).promise(); этот фрагмент кода. эта надежда верна. Я не знаю, что createCommit возвращается. Просто убедитесь, что вы не добавляете ничего лишнего, похожего на .then . Убедитесь, что ваша createCommit функция работает.

4. Я думаю, что это довольно стандартная часть AWS SDK, например, это функция getLastCommitId, которую я написал, которая работает и ожидает возврата моей функции: ` функция async getLastCommitId() { const params = {branchName, repositoryName}; const result = await codecommit.getBranch(params).promise(); возвращает result.branch.commitId; } `

5. Не могли бы вы поделиться ссылкой поддержки, если она у вас есть. Кроме того, вы пробовали удалять .promis() и тестировали? иногда в документе могут быть некоторые ошибки.

Ответ №2:

Итак, оказывается, я правильно использовал async / await, у меня просто был 3-секундный тайм-аут для лямбда-функции, поэтому она завершалась до того, как смогла получить ответ от вызова createCommit .