如何从Node.js中的Amazon S3存储桶同步下载文件

Sum*_*mit 0 javascript amazon-s3 amazon-web-services node.js aws-sdk-nodejs

我必须使用node.js从S3存储桶下载多个文件。为此,我必须编写for loop&调用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.
Run Code Online (Sandbox Code Playgroud)

但是作为s3.getObject异步调用,当前线程继续前进,fileContentList而在执行合并时没有任何添加。

我该如何解决这个问题?任何的想法?
在aws-sdk中是否有任何同步方法来下载文件?

小智 5

承诺是更好的方法,

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);
});
Run Code Online (Sandbox Code Playgroud)