more efficient way of looping await / async? [duplicate]

I am trying to get messages given a list of message ids (Gmail API).

let messageIdList = [msg1: { id: 1234 }, ...]
 
let messages = [];

for (const msg of messageIdList) {
    const response = await gapi.client.gmail.users.messages.get({
        'userId': 'me',
        'id': msg.id,
        'format': 'full'
    })

    messages.push(response.result);
};

// do something with messages

I used a for … of loop because of this post, so it works…but it’s super slow (I assume it’s because it goes one at a time). What would be a way to go about making all of the API calls be fired at the same time but somehow knowing when all of them are complete?