Я использую async / await в цикле for для ожидания метода get, который имеет наблюдаемую внутреннюю часть .. Поэтому я заключаю его в обещание, которое разрешается, когда наблюдаемые получают данные, а затем отписывается с помощью take (1) operator ..
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.log("url from get", url);
}
});
});
});
}
addImagen(postId, urls) {
const imagen: Imagen = {
postId: postId,
img: { ...urls }
};
this.afDB.list("imagenes").push(imagen);
}
приведенный выше код работает нормально, если длина base64data равна 1, но выдает следующую ошибку, когда его длина> 1
Ошибка: Uncaught (в обещании): [объект Объект]