【问题标题】:How to make lambda wait for callback?如何让 lambda 等待回调?
【发布时间】:2019-05-03 20:40:24
【问题描述】:

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

结果 => 这里1
[5秒等待]
这里2

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



async start() {
        try {
            console.log("here3");
            const data = await this.AppSync.getGraphqlApi({ apiId: this.apiId }).promise();
            console.log("here4");

结果 => 这里1
[5秒等待]
这里2
这里3
执行结束

我拥有所有必需的角色,并且在本地部署或调用时无服务器报告没有问题。

这是我的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]

提前感谢您的帮助!

【问题讨论】:

  • 能否请您在 start() 函数中发布 catch() 部分?会不会是this.AppSync.getGraphqlApi()抛出了一个已经被捕获但没有打印出来的异常?

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


【解决方案1】:

好的,我找到了解决方案,我只是这样做了:

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

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

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多