如何确保 Lambda 函数等待使用 await 调用异步函数?
How do I ensure a Lambda function waits for call to an async function with await?
我正在尝试编写一个 lambda 函数,它通过 Web 表单接受图像文件,并使用代码提交将其作为新提交写入存储库。出于某种原因,我的 lambda 函数似乎在调用 createCommit 之前退出,即使我使用 await 的方式与我之前在该函数中的调用类似。
我已经尝试重写包装 createCommit 的函数以仅使用承诺,但这似乎也不起作用。我想知道是否有一些我不知道的 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 的调用完成,但它只是打印出以 "creating commit against last commit..." 开头的 console.log 并退出。
您不应同时使用 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();
事实证明我使用 async/await 是正确的,我只是在 lambda 函数上有 3 秒的超时,所以它在能够从 createCommit 调用中获得响应之前就退出了。
我正在尝试编写一个 lambda 函数,它通过 Web 表单接受图像文件,并使用代码提交将其作为新提交写入存储库。出于某种原因,我的 lambda 函数似乎在调用 createCommit 之前退出,即使我使用 await 的方式与我之前在该函数中的调用类似。
我已经尝试重写包装 createCommit 的函数以仅使用承诺,但这似乎也不起作用。我想知道是否有一些我不知道的 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 的调用完成,但它只是打印出以 "creating commit against last commit..." 开头的 console.log 并退出。
您不应同时使用 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();
事实证明我使用 async/await 是正确的,我只是在 lambda 函数上有 3 秒的超时,所以它在能够从 createCommit 调用中获得响应之前就退出了。