AngularFire tarefa observável armazenamento nunca é concluída

votos
1

Estou carregar uma imagem galeria câmera para Firebase com sucesso, no entanto eu sou incapaz de getDownloadURL () como a tarefa de armazenamento AngularFire observável nunca completa.

Tenho consultado a documentação seguindo o 'percentual de upload Monitoramento' - Exemplo de Uso aqui

Por favor, você pode gentilmente aconselhar o que estou fazendo de errado ou recomendar uma abordagem alternativa. Obrigado.

async onCamera(){
      try{
          const options: CameraOptions = {
          quality: 100,
          targetHeight:500,
          targetWidth:500,
          allowEdit: true,
          correctOrientation: true,
          sourceType: this.camera.PictureSourceType.PHOTOLIBRARY,
          destinationType: this.camera.DestinationType.DATA_URL,
          encodingType: this.camera.EncodingType.JPEG,
          mediaType: this.camera.MediaType.PICTURE
        }
        const imageData = await this.camera.getPicture(options);
        const image = 'data:image/jpeg;base64,' + imageData;
        const id = Math.random().toString(36).substring(2);
        const user = this.authenticatorService.getUser();
        const fileRef = this.afStorage.ref(user.uid + '/images/categories/'+id);
        const task = fileRef.putString(image, 'data_url');
        console.log('Done! - I can see this comment successfully logged to the terminal');
        //---------------------------------
        // But this Observable never completes?....
        //---------------------------------
        task.snapshotChanges().pipe(
          finalize(() => {
            console.log('Sequence complete'); // Execute when the observable completes: never logged
            this.downloadURL = fileRef.getDownloadURL();
            this.downloadURL.subscribe(url=> this.imageUrl=url);
            console.log('My ImageUrl' + this.imageUrl); // Never logged to terminal?
          }));

        console.log('Finished! - I can see this comment successfully logged to the terminal');
      } catch(e) {
        console.error(e);
        this.errorMessage = JSON.stringify(e);
        console.log(this.errorMessage);
      }
    }

Importações relevantes

import { AngularFireStorage, AngularFireStorageReference, AngularFireUploadTask } from '@angular/fire/storage';
    import { Observable } from 'rxjs/Observable';
    import { Camera, CameraOptions} from '@ionic-native/camera/ngx';
    import { finalize } from 'rxjs/operators';

Ionic Native 5 Referência: https://blog.ionicframework.com/help-test-ionic-native-5/

Dependências relevantes

dependencies: {
    @angular/animations: 6.1.0,
    @angular/common: 6.1.0,
    @angular/compiler: 6.1.0,
    @angular/compiler-cli: 6.1.0,
    @angular/core: 6.1.0,
    @angular/fire: ^5.1.0,
    ....
    @ionic-native/camera: ^5.0.0-beta.22,
    @ionic-native/core: ^5.0.0-beta.22,
    ...
    cordova-plugin-camera: ~4.0.3,
    ...
    firebase: ^5.5.9,
    ionic-angular: 3.9.2,
    promise-polyfill: ^8.1.0,
    rxjs: ^6.3.3,
    rxjs-compat: ^6.3.3,
    cordova-android: ~7.1.4
  },
Publicado 19/12/2018 em 14:21
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Você olha como você é de 99,9% do caminho até lá, bom trabalho em um presente! E obrigado por fornecer os links para os docs. Penso que a razão que o finalize()nunca é disparando é porque você não está assinando o .snapshotChanges(). Sem .subscribe()o seu código não vai realmente ouvir as alterações disparou por task.snapshotChanges().

No exemplo que você encontrou , observe que há um .subscribe()preso em após a .pipe():

// get notified when the download URL is available
task.snapshotChanges().pipe(
    finalize(() => this.downloadURL = fileRef.getDownloadURL() )
)
.subscribe()

Portanto, o seu código deve ser:

//---------------------------------
// But this Observable never completes?....
//---------------------------------
task.snapshotChanges().pipe(
    finalize(() => {
        this.downloadURL = fileRef.getDownloadURL();
        console.log('My ImageUrl' + this.downloadURL);
    })
).subscribe();
Respondeu 09/01/2019 em 13:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more