我试图在承诺内从Amazon S3获取数千个文件,但我似乎无法弄清楚如何在列表被截断并在承诺内将其全部收集在一起的情况下包含ContinuationToken。我是JS的新手,可以使用一些帮助。以下是我目前的记录:
getFiles()
.then(filterFiles)
.then(mapUrls)
;
function getFiles(token) {
var params = {
Bucket: bucket,
MaxKeys: 5000,
ContinuationToken: token
};
var allKeys = [];
var p = new Promise(function(resolve, reject){
s3.listObjectsV2(params, function(err, data) {
if (err) {
return reject(err);
}
allKeys.push(data.Contents)
if (data.IsTruncated) {
s3.listObjectsV2({Bucket: bucket, MaxKeys: 5000, ContinuationToken: data.NextContinuationToken})
console.log('Getting more images...');
allKeys.push(data.Contents)
}
resolve(data.Contents);
});
});
return p;
}
我需要函数继续运行,直到我创建了bucket中所有要返回的对象的列表。
您需要ContinuationToken只有第二次。
var params = {
Bucket: bucket,
MaxKeys: 5000,
};
if (data.IsTruncated) {
s3.listObjectsV2({...params, ContinuationToken: data.NextContinuationToken})
IMO,这只是一个s3函数调用两次,更像一个嵌套呼叫递归是指函数不断调用自己直到满足指定的条件。
阅读更多关于递归的信息:https://medium.com/@vickdayaram/recursion-caad288bf621
我能够使用async/await列出bucket中的所有对象,并使用下面的代码填充数组。
async function getFiles(objects = []) {
const response = await s3.listObjectsV2(params).promise();
response.Contents.forEach(obj => filelist.push(obj.Key));
if (response.NextContinuationToken) {
params.ContinuationToken = response.NextContinuationToken;
await getFiles(params, objects);
}
console.log(filelist.length)
return filelist;
}
感谢所有帮助过我的人!