如何确保Lambda函数通过await等待调用异步函数?

时间:2019-04-06 19:38:20

标签: node.js async-await aws-lambda es6-promise aws-codecommit

我正在尝试编写一个lambda函数,该函数通过Web表单接受图像文件,并使用代码提交将其作为新提交写入存储库。由于某种原因,即使我使用的等待方式与函数中先前的调用类似,我的lambda函数似乎在调用createCommit之前退出。

我试图重写包装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 result;
}

我希望lambda函数可以等到对createCommit的调用完成,但是它只是打印出console.log并从“根据最后一次提交创建提交...”开始并退出。

2 个答案:

答案 0 :(得分: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();

然后退出

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 :(得分:0)

因此,事实证明我正确使用了async / await,我在lambda函数上只有3秒钟的超时,因此它在能够从createCommit调用获取响应之前退出了。