【发布时间】:2021-10-26 08:59:26
【问题描述】:
我试图在 Promise 中从 Amazon S3 获取数千个文件,但如果列表被截断并将其全部收集到 Promise 中,我似乎无法弄清楚如何在其中包含 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;
}
我需要该函数继续运行,直到我创建了存储桶中所有要返回的对象的列表。
【问题讨论】:
-
你得到什么错误?
-
我已经达到了可以收集 2000 个我需要的文件的程度,但我需要再做几次。我需要某种递归循环,直到
if (data.IsTruncated)返回错误。 -
看起来您需要在第二次和后续迭代中生成额外的
Promise-s,因为对listObjectsV2的调用是异步的。当data.IsTruncated为假时,您将停止创建Promise-s。 -
如果不是另一个
Promise,则在第二个listObjectsV2之后添加代码以收集其他结果(这是缺失的——实际上您可能会丢弃第二个迭代结果。)
标签: javascript amazon-web-services aws-sdk