Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Lambda Promise中的变量异步函数中的变量w/Promise.all_Javascript_Node.js_Amazon Web Services_Aws Lambda - Fatal编程技术网

Javascript Lambda Promise中的变量异步函数中的变量w/Promise.all

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) {

我已经浪费了两天时间试图找到答案。为了简单起见,我将代码简化为大部分伪代码

我需要一个异步函数,该函数作为来自SQS队列的触发器调用。代码循环遍历发送的10个SQS记录,并为每个记录调用Twilio并使用promise格式。我想在这个过程中构建一个数组,以便在最后可以对DynamoDB进行批写入

我不知道如何在Twilio promise内部维护/添加一个数组,这样就可以在外部/以后读取。

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的最后一行返回吧?我不知道你想返回什么,所以我不知道。当一切都完成后,你希望处理的是你将返回的东西。当所有的承诺都完成时,您将拥有一个数组,其中包含您返回的任何内容。