Я использую async / await в цикле for, чтобы дождаться метода get, внутри которого есть наблюдаемое. Поэтому я заключаю его в обещание, которое разрешается, когда наблюдаемые данные приема, а затем он отписывается с помощью оператора take (1) ..
async addImgStorage(postId, base64data) {
let urls = [];
for (let i = 0; i < base64data.length; i++) {
const file = "data:image/jpg;base64," + base64data;
const filePath = "img/" + postId + "_" + i;
let url = await this.getUrl(filePath, file);
urls.push(url);
}
this.addImagen(postId, urls);
}
getUrl(filePath, file) {
return new Promise((resolve, reject) => {
const ref = this.storage.ref(filePath);
ref.putString(file, "data_url").then(() => {
const downloadURL = ref
.getDownloadURL()
.pipe(take(1))
.subscribe(url => {
if (url) {
resolve(url);
console.info("url from get", url);
}
});
});
});
}
addImagen(postId, urls) {
const imagen: Imagen = {
postId: postId,
img: { ...urls }
};
this.afDB.list("imagenes").push(imagen);
}
приведенный выше код отлично работает, если длина base64data равна 1, но выдает следующую ошибку, когда его длина> 1
ERROR Error: Uncaught (in promise): [object Object]
альтернатива, если вы хотите использовать другой подход. stackoverflow.com/questions/28983424/…





Решено: я просто забыл добавить индекс в base64data при назначении константы файла ... поэтому я передавал весь массив в запросе ...