gpt4 book ai didi

node.js - 鉴于所有调用都是异步的,您如何在 lambda 中构建顺序 AWS 服务调用?

转载 作者:IT老高 更新时间:2023-10-28 23:01:50 26 4
gpt4 key购买 nike

我来自 java 背景,所以对 Lambda 所需的 Javascript 约定有点陌生。

我有一个 lambda 函数,它旨在以特定顺序执行多个 AWS 任务,具体取决于前一个任务的结果。

鉴于每个任务都异步报告其结果,我想知道是否以正确的方式确保它们都以正确的顺序发生,并且一个操作的结果可用于调用下一个函数。

似乎我必须在先前函数的回调中调用每个函数,但这似乎会进行某种深度嵌套,并且想知道这是否是执行此操作的正确方法。

例如,这些函数中的一个需要 DynamoDB getItem,然后调用 SNS 以获取端点,然后调用 SNS 以发送消息,然后调用 DynamoDB 写入。

在 lambda javascript 中,考虑所有异步性的正确方法是什么?

最佳答案

我喜欢@jonathanbaraldi 的回答,但我认为如果您使用 Promises 管理控制流会更好。 Q 库有一些方便的函数,如 nbind,它们有助于将 Node 样式回调 API (如 aws-sdk)转换为 Promise。

所以在本例中,我将发送一封电子邮件,然后在收到电子邮件回复后,我将发送第二封电子邮件。这基本上就是要求的,依次调用多个服务。我正在使用 promise 的 then 方法以垂直可读的方式管理它。还使用 catch 来处理错误。我认为仅仅嵌套回调函数会更好。

var Q = require('q');
var AWS = require('aws-sdk');
AWS.config.credentials = { "accessKeyId": "AAAA","secretAccessKey": "BBBB"};
AWS.config.region = 'us-east-1';

// Use a promised version of sendEmail
var ses = new AWS.SES({apiVersion: '2010-12-01'});
var sendEmail = Q.nbind(ses.sendEmail, ses);

exports.handler = function(event, context) {

console.log(event.nome);
console.log(event.email);
console.log(event.mensagem);

var nome = event.nome;
var email = event.email;
var mensagem = event.mensagem;

var to = ['email@company.com.br'];
var from = 'site@company.com.br';

// Send email
mensagem = ""+nome+"||"+email+"||"+mensagem+"";

console.log(mensagem);

var params = {
Source: from,
Destination: { ToAddresses: to },
Message: {
Subject: {
Data: 'Form contact our Site'
},
Body: {
Text: {
Data: mensagem,
}
}
};

// Here is the white-meat of the program right here.
sendEmail(params)
.then(sendAnotherEmail)
.then(success)
.catch(logErrors);

function sendAnotherEmail(data) {
console.log("FIRST EMAIL SENT="+data);

// send a second one.
return sendEmail(params);
}

function logErrors(err) {
console.log("ERROR="+err, err.stack);
context.done();
}

function success(data) {
console.log("SECOND EMAIL SENT="+data);
context.done();
}
}

关于node.js - 鉴于所有调用都是异步的,您如何在 lambda 中构建顺序 AWS 服务调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27716628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com