Javascript Lambda Promise中的变量异步函数中的变量w/Promise.all
我已经浪费了两天时间试图找到答案。为了简单起见,我将代码简化为大部分伪代码 我需要一个异步函数,该函数作为来自SQS队列的触发器调用。代码循环遍历发送的10个SQS记录,并为每个记录调用Twilio并使用promise格式。我想在这个过程中构建一个数组,以便在最后可以对DynamoDB进行批写入 我不知道如何在Twilio promise内部维护/添加一个数组,这样就可以在外部/以后读取。Javascript Lambda Promise中的变量异步函数中的变量w/Promise.all,javascript,node.js,amazon-web-services,aws-lambda,Javascript,Node.js,Amazon Web Services,Aws Lambda,我已经浪费了两天时间试图找到答案。为了简单起见,我将代码简化为大部分伪代码 我需要一个异步函数,该函数作为来自SQS队列的触发器调用。代码循环遍历发送的10个SQS记录,并为每个记录调用Twilio并使用promise格式。我想在这个过程中构建一个数组,以便在最后可以对DynamoDB进行批写入 我不知道如何在Twilio promise内部维护/添加一个数组,这样就可以在外部/以后读取。 exports.handler = async function(event, context) {
exports.handler = async function(event, context) {
let messages = [];
//LOOP THROUGH SQS RECORDS
event.Records.forEach(record => {
//QUERY DYNAMO FOR DUPLICATES
//IF NOT A DUPLICATE
twilio.messages.create({
body: event.text,
to: event.phone,
from: '+15005550006'
})
.then((message) => {
//ADD MESSAGE TO STATUS SQS
//CREATE ARRAY FOR ENTRY INTO DYNAMODB BATCH WRITE
var item = {
PutRequest: {
Item: {
'msgid': { S: msgid },
'text': { S: text },
'phone': { S: phone },
'date': { S: now }
}
}
};
});
//END IF NOT A DUPLICATE
});
//BATCH WRITE TO DYNAMO OF ALL ITEMS IN MESSAGES ARRAY
};
let messages = [];
var messagePromises = event.Records.map(record => {
var text = record.body;
var phone = record.messageAttributes["phone"].stringValue;
var msgserviceid = record.messageAttributes["msgserviceid"].stringValue;
var userid = record.messageAttributes["userid"].stringValue;
var credits = record.messageAttributes["credits"].stringValue;
var item = [];
var payload = {
"phone": phone,
"text": text,
"msgserviceid": msgserviceid
};
return twilio.messages.create({
body: text,
to: phone,
from: '+15005550006'
}).then((message) => {
var msgid = message.sid;
var now = new Date().toISOString().slice(0, 19).replace('T', ' ');
var item = {
PutRequest: {
Item: {
'msgid': { S: msgid },
'text': { S: text },
'phone': { S: phone }
}
}
};
messages.push(item);
console.log("message", message);
return message;
}).catch((error) => {
console.log("error", error);
});
});
Promise.all(messagePromises).then((values) => {
console.log(values);
});
};```
编辑:这是基于建议的实际代码。console.log上都没有记录任何内容,甚至“消息”也没有记录。目前正试图从那时起得到任何东西,并以承诺的方式返还。实际上需要返回消息数组,但正在尝试获取要返回的内容。
exports.handler = async function(event, context) {
let messages = [];
//LOOP THROUGH SQS RECORDS
event.Records.forEach(record => {
//QUERY DYNAMO FOR DUPLICATES
//IF NOT A DUPLICATE
twilio.messages.create({
body: event.text,
to: event.phone,
from: '+15005550006'
})
.then((message) => {
//ADD MESSAGE TO STATUS SQS
//CREATE ARRAY FOR ENTRY INTO DYNAMODB BATCH WRITE
var item = {
PutRequest: {
Item: {
'msgid': { S: msgid },
'text': { S: text },
'phone': { S: phone },
'date': { S: now }
}
}
};
});
//END IF NOT A DUPLICATE
});
//BATCH WRITE TO DYNAMO OF ALL ITEMS IN MESSAGES ARRAY
};
let messages = [];
var messagePromises = event.Records.map(record => {
var text = record.body;
var phone = record.messageAttributes["phone"].stringValue;
var msgserviceid = record.messageAttributes["msgserviceid"].stringValue;
var userid = record.messageAttributes["userid"].stringValue;
var credits = record.messageAttributes["credits"].stringValue;
var item = [];
var payload = {
"phone": phone,
"text": text,
"msgserviceid": msgserviceid
};
return twilio.messages.create({
body: text,
to: phone,
from: '+15005550006'
}).then((message) => {
var msgid = message.sid;
var now = new Date().toISOString().slice(0, 19).replace('T', ' ');
var item = {
PutRequest: {
Item: {
'msgid': { S: msgid },
'text': { S: text },
'phone': { S: phone }
}
}
};
messages.push(item);
console.log("message", message);
return message;
}).catch((error) => {
console.log("error", error);
});
});
Promise.all(messagePromises).then((values) => {
console.log(values);
});
};```
所有的承诺都会变成一个数组。并用来知道他们什么时候完成
var messagePromises = event.Records.map(record => {
return twilio.messages
.create({...})
.then((message => {
return {
whatever: "you want to return";
};
});
});
Promise.all(messagePromises).then((values) => {
console.log(values);
});
基本思想
const twilio={
信息:{
创建:(foo)=>{
返回新承诺((解决)=>{
var num=Math.floor(Math.random()*3000);
window.setTimeout(()=>解析({
[foo]:num
}),num);
});
}
}
};
常量事件={
记录:[{
姓名:“富”
}, {
名称:“酒吧”
}, {
名称:“Baz”
}]
};
var messagePromises=event.Records.map(record=>{
返回消息
.create(record.name)
。然后((消息)=>{
控制台日志(消息);
返回消息;
});
});
Promise.all(messagePromises).then((值)=>{
console.log(值);
});代码>将所有承诺放在一个数组中。然后调用Promise.all()。在其.then()
函数中,您将能够读取所有数组内容。执行此操作时,当promise.all运行时,数组消息始终为空。这样做有点范围问题。然后你显然做错了。展示你所尝试的。完全按照@Barmar所说的。您需要在forEach循环之外定义空数组,将承诺推入数组,然后调用Promise.all()将承诺数组作为参数传递。它将解决阵列中的所有承诺。我明白了这个概念。你们推荐的东西实际上不起作用。当promise.all运行时,消息数组为空,但消息数组在then中已正确填充。好的,您可以向我展示此promise的内部。我如何访问数组消息?当我尝试的时候,它总是空的,即使我已经证明它是在那时候被填充的。它是一个数组,你从上一次返回的任何东西。你能给我一个例子吗?这将是我的下一个问题,循环中是否有回报。听起来是的。那么就把信息作为Twilio的最后一行返回吧?我不知道你想返回什么,所以我不知道。当一切都完成后,你希望处理的是你将返回的东西。当所有的承诺都完成时,您将拥有一个数组,其中包含您返回的任何内容。