[英]How to make lambda wait for callback?
我正在創建一個AWS lambda函數,該函數應該定期備份S3上的AppSync API(它由CloudWatch調度規則觸發)。 它基於一個類,對於作為函數args(使用環境變量)傳遞的每個API,它為API的每個元素運行備份作業。
如果我只使用節點運行它,它沒有任何問題。
但是,當我使用無服務器框架( serverless deploy
和serverless invoke local -f backup
)在本地部署或測試時,執行將在處理程序函數以外的范圍內的第一個異步指令處停止,無論我是否使用回調, Promise.then()或async / await語法。
我已經考慮過,為備份操作的每個部分運行多個lambda函數,但是我會丟失共享上下文,我需要確保備份的每個部分都正確完成。
在handler.js
// for testing purposes
// works, waits 5 seconds and execute the rest of the code
console.log("here1");
await new Promise(resolve => setTimeout(resolve, 5000));
console.log("here2");
const allBackups = apiIds.map(apiId => new Backup(apiId));
allBackups.map(backup => backup.start());
結果=> here1
[等待5秒]
here2
但是,如果我調用使用異步代碼的函數,例如Backup
類的start
方法(在所需的Backup.js
文件中), Backup.js
發生以下情況:
async start() {
try {
console.log("here3");
const data = await this.AppSync.getGraphqlApi({ apiId: this.apiId }).promise();
console.log("here4");
結果=> here1
[等待5秒]
here2
here3
執行結束
我有所有必需的角色,無服務器報告在本地部署或調用時沒有問題。
這是我的serverless.yml
文件:
service: [name]
provider:
name: aws
runtime: nodejs8.10
functions:
backup:
handler: handler.backup
environment:
[env variables, they are parsed properly]
timeout: 60
event:
schedule: [doesn't work as well, but it's not the issue here]
name: daily-appsync-backup
rate: cron(0 0 ** ? *)
enabled: false
role: [role]
在此先感謝您的幫助 !
好的,我找到了一個解決方案,我剛剛這樣做了:
const allBackups = apiIds.map(apiId => new Backup(apiId));
await Promise.all(allBackups.map(async backup => backup.start()));
它不起作用,因為它到達處理函數的末尾,並不關心有其他回調等待。 (我還了解到你可以await
一個async
函數,而不僅僅是一個Promise。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.