Я пишу веб-приложение на основе Firebase, и вот что я пытаюсь сделать:
- Пользователь загружает несколько фотографий.
- Пользователь выбирает порядок фотографий для будет отображаться в его / ее сообщениях.
- Пользователь запускает действие загрузки.
- Изображения загружаются в порядке, указанном в шаге # 2, а затем URL-адреса сохраняются в базе данных, так что они показаны в следующем порядке.
Чтобы выполнить 4, я написал ниже функцию, которая будет возвращать обещание, которое может быть выполнено другой функцией, которая фактически выполняет загрузку.
const url_array_get = () => {
const user=firebase.auth().currentUser;
const photos1 = photoorder.map(position => photos[position - 1]); //Code to reshuffle the photos according to the order the user has set
const ref=firebase.storage().ref('data/'+user.uid+'/posts/');
let promises = photos1.map((p1) => { //Trigger upload for each of the photo in the intended order
console.log('uploading :',p1);
return ref.child(p1.name).put(p1).then((snapshot) => {
console.log('getting url :',p1);
return snapshot.ref.getDownloadURL();
})
});
return Promise.all(promises);
}
Однако проблема в том, что когда я смотрю на результаты console.log, код загружает фотографии в заданном порядке, но URL-адреса не загружаются в заданном порядке ... и, следовательно, не отображаются в заданном заказать также. Я предполагаю, что это потому, что часть загрузки выполняется асинхронно, и, следовательно, меньшие фотографии получают URL-адреса быстрее.
Как я могу исправить код, чтобы получить URL-адреса в нужном порядке? Я предполагаю, что хитрость заключается в том, чтобы инициировать следующую загрузку только после загрузки URL-адреса для предыдущей загрузки, но я новичок в программировании, и мне сложно переписать приведенный выше код.
Любой совет? Буду очень признателен!