Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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
在它之后访问node.js hashmap';s已完成填充//AWS lambda_Node.js_Amazon Web Services_Asynchronous_Amazon S3_Promise - Fatal编程技术网

在它之后访问node.js hashmap';s已完成填充//AWS lambda

在它之后访问node.js hashmap';s已完成填充//AWS lambda,node.js,amazon-web-services,asynchronous,amazon-s3,promise,Node.js,Amazon Web Services,Asynchronous,Amazon S3,Promise,所以我正在AWS中开发lambda,node.js对我来说也是新的。我相当肯定这与nodejs是异步的有关,可以通过promise/async/await解决,但没有解决方案可以帮助我。我已经尝试了很多例子,但我无法根据自己的情况进行调整。我已将代码超级简化为以下内容: var fs = require('fs'); var es = require('event-stream'); let m = new Map(); const aws = require("aws-sdk&quo

所以我正在AWS中开发lambda,node.js对我来说也是新的。我相当肯定这与nodejs是异步的有关,可以通过promise/async/await解决,但没有解决方案可以帮助我。我已经尝试了很多例子,但我无法根据自己的情况进行调整。我已将代码超级简化为以下内容:

var fs = require('fs');
var es = require('event-stream');
let m = new Map();
const aws = require("aws-sdk");
let params = {...}; //details omitted, but refers to a csv file
let s3 = new aws.S3();

module.exports.handler = (event, context, callback) => {
   s3.getObject(params).createReadStream().pipe(es.split()).on('data'), (row) => {
       let dat = row.toString().split(',').map(function(x) {return x.trim() });
       m.set(dat[0], dat[1]); // there's actually around 100 lines of logic that I'm simplifying
   });
console.log(m.size);
我明白为什么我总是穿0号,但我找不到解决办法。在映射完成填充之后,这里的目标是迭代它并将所有元素推送到dynamoDB中。(我不直接这样做,因为有很多更新,需要很多docClient.get/.query/.put)我只需要填充地图(换句话说,流已经完成)。我有点担心我过于简化了它,部分答案将涉及对我省略的逻辑做出额外的承诺,但我将从这里开始,因为测试这段代码也会产生0大小


谢谢你的帮助

是的,问题是异步性。代码的结构,简化:

// 1
s3.getObject(params).createReadStream().pipe(es.split()).on('data'), (row) => {
  ...
  // 3
});
// 2
console.log(m.size);
执行遵循1-2-3,因此console.log发生在任何数据到达之前。您可以侦听关闭事件并在其中打印结果:

s3.getObject(params).createReadStream().pipe(es.split()).on('data'), (row) => {
  ...
}).on('close', () => {
  console.log(m.size);
}