簡體   English   中英

如何讓lambda等待回調?

[英]How to make lambda wait for callback?

我正在創建一個AWS lambda函數,該函數應該定期備份S3上的AppSync API(它由CloudWatch調度規則觸發)。 它基於一個類,對於作為函數args(使用環境變量)傳遞的每個API,它為API的每個元素運行備份作業。

如果我只使用節點運行它,它沒有任何問題。

但是,當我使用無服務器框架( serverless deployserverless 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM