我的removeObjects函数让我陷入困境。该函数假设syncronoulsy获取S3存储桶中的对象列表,然后异步删除对象。如果列表被截断,则重复此操作,直到没有其他对象要删除。 (AWS不提供存储桶中对象的总数,而listObjects会提供结果。)
我做错了什么/为什么我的功能不起作用?该解决方案应该利用JS的单线程和异步性质。为了赏金,我希望得到一个特定于该模块的答案。如果您想查看整个模块,git repo是公开的。
export function removeObjects(params: IS3NukeRequest): Promise<S3.Types.DeleteObjectsOutput> {
const requests: Array<Promise<S3.Types.DeleteObjectsOutput>> = [];
let isMore;
do {
listObjectsSync(params)
.then((objectList: S3.Types.ListObjectsV2Output) => {
isMore = objectList.ContinuationToken = objectList.IsTruncated ? objectList.NextContinuationToken : null;
requests.push(params.Client.deleteObjects(listObjectsV2Output2deleteObjectsRequest(objectList)).promise());
})
.catch((err: Error) => { Promise.reject(err); });
} while (isMore);
return Promise.all(requests);
}
export async function listObjectsSync(params: IS3NukeRequest): Promise<S3.Types.ListObjectsV2Output> {
try {
return await params.Client.listObjectsV2(s3nukeRequest2listObjectsRequest(params)).promise();
} catch (err) {
return Promise.reject(err);
}
}
感谢。
答案 0 :(得分:0)
问题是listObjectsSync
函数返回Promise
,因此您需要将其视为异步函数,而不能只使用循环。你需要做的是在你的isMore
为真时创建一连串的承诺,我已经使用递归方法完成了它(我不是TS中的专业人员,所以请在使用之前检查代码)。我还没有尝试过代码,但从逻辑上说它应该可以工作:)
const requests: Array<Promise<S3.Types.DeleteObjectsOutput>> = [];
function recursive(recursiveParams) {
return listObjectsSync(recursiveParams).then((objectList: S3.Types.ListObjectsV2Output) => {
let isMore = objectList.ContinuationToken = objectList.IsTruncated ? objectList.NextContinuationToken : null;
requests.push(params.Client.deleteObjects(listObjectsV2Output2deleteObjectsRequest(objectList)).promise());
if (isMore) {
//do we need to change params here?
return recursive(recursiveParams)
}
//this is not necessary, just to indicate that we get out of the loop
return true;
});
}
return recursive(params).then(() => {
//we will have all requests here
return Promise.all(requests);
});