如何使Lambda等待回调?

时间:2019-05-03 10:58:05

标签: node.js async-await aws-lambda serverless-framework

我正在创建一个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

但是,如果我调用一个使用异步代码的函数,例如start类的Backup方法(在所需的Backup.js文件中),则会发生以下情况:< / p>



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]

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好,所以我找到了一个解决方案,我就是这样做的:

    const allBackups = apiIds.map(apiId => new Backup(apiId));
    await Promise.all(allBackups.map(async backup => backup.start()));

它不起作用,因为它到达了处理程序函数的末尾,并且不在乎是否有其他回调在等待。 (我还了解到,您可以await一个async函数,而不仅仅是一个Promise。)