Асинхронный вызов функции в AWS Lambda

Я пытаюсь вызвать функцию как асинхронную, потому что не хочу ждать ответа.

Я прочитал документы 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()

Кто-нибудь может мне объяснить, почему это происходит?


person Community    schedule 19.02.2019    source источник


Ответы (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);
});
person Dave Maple    schedule 19.02.2019