เรียกใช้ฟังก์ชัน async บน 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