Sorry if the question doesn't make a lot of sense, because it's honestly going to be hard for me to explain, but the gist of it is that I have a list of images that I need to get from our AWS S3
bucket inside an async map function. After it has iterated through all of the images that I need, I need to return the results outside of the Promise.all()
method that this map function is inside. Let me show you what I meant by the code I have.
let res = Promise.all(ads.map(async (ad) => {
let result = await ListObjects('bucket', '/', `Items/${ad.ID}_${ad.Year}`, (response) => {
if(!response){
console.error('There was an issue getting these images');
}else if(response.Contents.length > 0){
let list = response.Contents.map(obj => ({Path: obj.Key, Date: new Date(obj.LastModified).getTime()}));
list.sort((a,b) => a.Date < b.Date ? 11 : a.Date > b.Date ? -1 : 0);
return list[0];
}else{
console.log('no previous ads')
}
})
console.log(result); // I expect a single object from ListObjects but I get undefined
return result
}));
console.log(res); // expecting to get an array of objects here, but I get undefined
return res;
}
export const ListObjects = (bucket, delimeter, prefix, callback) => {
try{
// could just use the s3 client config instead.
aws.config.update({
accessKeyId: access_key,
secretAccessKey: secret_access_key,
region: 'myregion'
});
const s3 = new S3();
s3.listObjectsV2({
Bucket: bucket,
Delimiter: delimeter,
Prefix: prefix
}, (err,data) => {
if(err){
console.error(err);
callback(false);
}else{
callback(data);
}
})
}catch(e){
console.log('ERROR: S3.ListObjects: ' + e);
callback(false);
}
}
My ListObjects
method uses a callback and I'm not sure if this would need to be a promise instead of a callback function to make this request possible, but any clue on how I can make this possible would really help. TIA!