Я использую angularfire2 для загрузки изображения в хранилище Firebase. Загрузка работает очень хорошо, хотя у меня возникают проблемы с ожиданием, пока мой код для загрузки URL будет доступен. Вот код, когда файл выбирается
async onFilesAdded(event){
console.log("file added")
if (event.target.files.length > 0) {
const file = event.target.files[0];
console.log("File name is:" + file.name)
await this.dataSvc.pushUpload(file).then(
(res) => {
console.log("download url is::" + this.dataSvc.downloadURL)
},
(err) => console.log("fail to upload file:" + err)
)
}
}
Мой сервис реализует это, как показано ниже
pushUpload(file: File) {
const filePath = '/' + file.name;
const fileRef = this.storage.ref(filePath);
return new Promise<any>((resolve, reject) => {
const task = this.storage.upload(filePath, file);
task.snapshotChanges().pipe(
finalize(() => this.downloadURL = fileRef.getDownloadURL() )
).subscribe(
res => resolve(res),
err => reject(err))
}
)
}
Я надеюсь подождать, пока обещание не будет выполнено, и я увижу URL-адрес загрузки. Но мой код, кажется, не ждет, и я получаю неопределенный downloadUrl, и через несколько секунд URL загрузки фактически появляется в сервисе. Так что в основном мой код, вызывающий pushUpload, не ждет окончания загрузки.
Еще один вариант, где я никогда не получаю URL загрузки внутри финализатора
pushUpload(file: File) {
const path = '/' + file.name;
const ref = this.storage.ref(path);
let task = this.storage.upload(path, file);
let snapshot = task.snapshotChanges().pipe(
finalize( async() => {
this.downloadURL = await ref.getDownloadURL().toPromise();
console.log("download url i got is:" + this.downloadURL)
}),
);
}