Как мне обеспечить, чтобы лямбда-функция ожидала вызова асинхронной функции с помощью await? - PullRequest
0 голосов
/ 06 апреля 2019

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

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

это мой основной обработчик лямбда-событий:

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 result;
}

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

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Не следует использовать 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();

и без

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();
0 голосов
/ 06 апреля 2019

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

...