так что я угловое приложение, которое позволяет вам загружать некоторые вещи в облачное хранилище. скажем, название, описание и некоторые изображения. Я храню изображения в хранилище Firebase, а затем добавляю URL загрузки для FireBase, а также. Я создаю метод, который принимает массив файлов, обрезает изображения до более удобного размера и затем загружает эти файлы в хранилище firebase:
uploadImages(images, title) {
const urls: string[] = [];
this.ng2ImgToolsService.resize(images, 700, 400).subscribe(result => {
const uploadImage = new File([result], result.name);
const path = `${title}/${Date.now()}_${uploadImage.name}`;
const ref = this.storage.ref(path);
const task = this.storage.upload(path, uploadImage);
task.snapshotChanges().pipe(tap(), finalize(async () => {
const url = await ref.getDownloadURL().toPromise;
urls.push(url);
}));
}, error => {
console.log('resize failed, returning original images: ' + error)
});
return urls;
}
это, очевидно, не работает. Я также попытался обернуть все в обещание, чтобы я мог сделать;
const urls = await this.uploadImages(...);
но в этот момент у меня есть наблюдаемые в наблюдаемых в обещании наблюдаемых, и я должен признать, что у меня над головой. времена, когда я работал с асинхронными задачами, они были более прямыми.
Я провожу еще пару дней, читая RxJ, но боюсь, что не могу понять это самостоятельно.
Подводя итог, эта функция должна возвращать массив URL-адресов, мне нужно иметь возможность ждать этого массива, поэтому в основном ждите загрузки всего в firestore, пока у меня не появятся URL-адреса загрузки.
редактировать
Хорошо, после игры с ответом dockleryxk, я все еще сталкиваюсь с некоторыми проблемами. Прежде всего, функция «ng2ImgToolsService.resize (images, 700, 400)» принимает массив изображений и возвращает обещание, которое будет проходить через каждое обрезанное изображение, как только это будет сделано, на месте всех их сразу , Поэтому, если я попытаюсь обернуть это в обещание и разрешить вывод этой наблюдаемой, он вернет только одно изображение (в зависимости от того, что будет обрезано первым). Таким образом, я должен был бы ждать, пока наблюдаемое будет сделано, испуская данные? Это возможно?
Во-вторых, если бы я действительно все разделил, чтобы, получив массив обрезанных изображений, я поместил эти изображения в новую функцию. В этой функции я должен был бы перебрать этот массив и загрузить их один за другим.
uploadImages2(images, title) {
const observables = [];
for (let image of images) {
const path = `${title}/${Date.now()}_${image.name}`;
const ref = this.storage.ref(path);
const task = this.storage.upload(path, image);
task.snapshotChanges().pipe(tap(), finalize(async () => {
const url = ref.getDownloadURL();
observables.push(url);
}));
}
return new Promise((resolve, reject) => {
Observable.combineLatest(observables).subscribe(
responses => {
resolve(responses);
},
error => {
console.log('error:', error);
reject(error);
}
);
});
}
это правильно загружает изображения, но не возвращает загруженный массив URL. оно в основном замирает где-то в обещании