Estoy tratando de obtener miles de archivos de Amazon S3 dentro de una Promesa, pero parece que no puedo averiguar cómo incluir el ContinuationToken dentro si la lista está truncada y reunirlos todos dentro de la promesa. Soy un novato con JS y me vendría bien un poco de ayuda. Esto es lo que tengo, hasta ahora:
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; }Necesito que la función continúe ejecutándose hasta que haya creado una lista de todos los objetos en el depósito para devolver.
Necesita ContinuationToken solo la segunda vez.
var params = { Bucket: bucket, MaxKeys: 5000, }; if (data.IsTruncated) { s3.listObjectsV2({...params, ContinuationToken: data.NextContinuationToken})En mi opinión, esta es solo una función s3 llamada dos veces, más como una llamada anidada. La recursividad es cuando una función sigue llamándose a sí misma hasta que se cumple una condición específica.
Lea más sobre la recursividad: https://medium.com/@vickdayaram/recursion-caad288bf621
Pude enumerar todos los objetos en el depósito usando async/await y el código a continuación para completar una matriz.
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; }¡Gracias a todos los que ayudaron!