我正在尝试编写一个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并从“根据最后一次提交创建提交...”开始并退出。
答案 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调用获取响应之前退出了。