在AWS Lambda上调用功能异步

时间:2019-02-19 14:29:14

标签: javascript node.js aws-sdk

我试图以异步方式调用函数,因为我不想等待响应。

我已经阅读过AWS文档,并说将InvocationType用作Event,但是只有在我做.promise()时它才有效。

无效版本

lambda.invoke({
  FunctionName: 'rock-function',
  InvocationType: 'Event',
  Payload: JSON.stringify({
    queryStringParameters: {
      id: c.id,
      template: c.csvTemplate
    }
  })
})

工作版本

lambda.invoke({
  FunctionName: 'rock-function',
  InvocationType: 'Event',
  Payload: JSON.stringify({
    queryStringParameters: {
      id: c.id,
      template: c.csvTemplate
    }
  })
}).promise()

我能解释一下为什么会发生吗?

1 个答案:

答案 0 :(得分:1)

invoke返回一个AWS.Request实例,该实例不会自动执行请求。它是请求的表示,直到调用send()才发送。

这就是为什么后者版本有效而​​前者无效的原因。调用.promise()时发送请求。

// a typical callback implementation might look like this
lambda.invoke({
    FunctionName: 'rock-function',
    InvocationType: 'Event',
    Payload: JSON.stringify({
        queryStringParameters: {
            id: c.id,
            template: c.csvTemplate,
        },
    }),
}, (err, data) => {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data);
    }
});

// ... or you could process the promise() for the same result
lambda.invoke({
    FunctionName: 'rock-function',
    InvocationType: 'Event',
    Payload: JSON.stringify({
        queryStringParameters: {
            id: c.id,
            template: c.csvTemplate,
        },
    }),
}).promise().then(data => {
    console.log(data);
}).catch(function (err) {
    console.error(err);
});