javascript - 如何在node.js中同步从Amazon S3存储桶下载文件

标签 javascript node.js amazon-web-services amazon-s3 aws-sdk-nodejs

我必须使用 node.js 从 S3 存储桶下载多个文件。为此,我必须编写一个 for 循环并调用 s3.getObject(param) 方法来下载。下载文件后,我必须合并它们的内容。

我是这样写的:

var fileContentList = new ArrayList();

for(i=0; i<fileNameList.length i++){
    s3.getObject({ Bucket: "my-bucket", Key: fileNameList.get(i) }, function (error, data) {
    if (error != null) {
      alert("Failed to retrieve an object: " + error);
    } else {
      alert("Loaded " + data.ContentLength + " bytes");
      fileContentList.add(data.Body.toString());
    }
  }
);
}

//Do merging with the fileContentList.

但是由于 s3.getObject 是一个异步调用,因此当前线程继续运行,并且在我进行合并时不会将任何内容添加到 fileContentList 中。

如何解决这个问题?有什么想法吗?
他们在aws-sdk中是否有同步方法来下载文件?

最佳答案

promise 是更好的方式,

var getObject = function(keyFile) {
    return new Promise(function(success, reject) {
        s3.getObject(
            { Bucket: "my-bucket", Key: keyFile },
            function (error, data) {
                if(error) {
                    reject(error);
                } else {
                    success(data);
                }
            }
        );
    });
}

var promises = [];
var fileContentList = new ArrayList();

for(i=0; i<fileNameList.length i++){
    promises.push(getObject(fileNameList.get(i)));
}

Promise.all(promises)
.then(function(results) {
    for(var index in results) {
        var data = results[index];
        fileContentList.add(data.Body.toString());
    }
    // continue your process here
})
.catch(function(err) {
    alert(err);
});

关于javascript - 如何在node.js中同步从Amazon S3存储桶下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868588/

相关文章:

node.js - 每个用户在哪里存储 SHA256 key 对

node.js - Sequelize finder 排除了属性但想要所有属性

amazon-web-services - EMR 事件停留在 Waiting_For_Runner 状态

javascript - 奇怪的javascript函数参数值

javascript - 显示未评估键的 JSON POST 请求对象

javascript - 要执行的 Connection.query

node.js - Lambda 函数失败,未生成日志

javascript - React-Redux 上下文中的 "Tearing"是什么?

javascript - 如何在此 amchart 示例代码中显示 y 轴值?

amazon-web-services - awswrangler 和 boto3 的区别?