0

Arbeiten an einem eckigen 4-Projekt mit Firebase.Firebase-Speicher Download-URL Vor dem Senden an die Firebase-Datenbankreferenz

Ich kämpfe um herauszufinden, wie man garantiert, dass ein Ergebnis von einem Observable zurückgegeben wurde, bevor Sie den nächsten Schritt ausführen.

Ich weiß, dass Sie das mit einem Observable nicht garantieren können, denn der springende Punkt ist, dass es ein Datenstrom ist, daher mein Dilemma.

Ich versuche, ein Bild auf Firebase-Speicher hochladen, rufen Sie die Download-URL vor führen Sie ein Update auf eine Firebase-Datenbank.

Jeder Rat würde geschätzt werden.

Register User Service

$key: string; 
    downloadUrl: string; 
    currentUser: any; 
    loginId: string; 

    constructor(
     private db: AngularFireDatabase, 
     private firebaseUploadService: FirebaseUploadService, 
     private authService: AuthService) { 
     this.firebaseUploadService.currentUrl.subscribe(url => this.downloadUrl = url); 
    } 

registerUser(firebaseRef: string, user: UserModel): Observable<any> { 

     // Create a separate object for file upload with the file passed via the entity 
     const file = Object.assign(<UploadModel>{}, user.imagePath); 
     user.$key = this.authService.currentUserId; 

     return this.firebaseUploadService.pushUpload(user.$key, file).switchMap(upload => { 
      console.log('upload returned from service: ', upload) 
      user.imagePath = this.downloadUrl; 
      return Observable.fromPromise(this.db.object(firebaseRef + '/' + user.$key).update(user)); 
     }); 
    } 

Firebase Upload Service

currentUser: any; 
    uploads: FirebaseListObservable<UploadModel[]>; 

    private urlSource = new BehaviorSubject('http://saveabandonedbabies.org/wp-content/uploads/2015/08/default.png'); 
    currentUrl = this.urlSource.asObservable(); 

    constructor() { 
    } 

pushUpload(firebaseRef: string, upload: UploadModel): any { 

     const storageRef = firebase.storage().ref(); 
     const uploadTask = storageRef.child(`${firebaseRef}/${upload.file.name}`).put(upload.file); 

     uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED, 
      (snapshot) => { 
       // upload in progress 
       upload.progress = (snapshot.bytesTransferred/snapshot.totalBytes) * 100 
      }, 
      (error) => { 
       // upload failed 
       console.log(error) 
      }, 
      () => { 
       // upload success 
       upload.url = uploadTask.snapshot.downloadURL 
       this.urlSource.next(upload.url) 
       upload.name = upload.file.name 
      } 
     ); 
     return this.urlSource; 
    } 

Antwort

0

Da alle Anrufe asynchron sind Firebase Sie synchron die Download-URL erhalten kann nicht. Aber es gibt einen Cheat, den du mit Versprechungen machen kannst.

Versuchen Sie Ihren Code Refactoring, wie unten:

pushUpload (firebaseRef: string, Upload: UploadModel): any {

const storageRef = firebase.storage().ref(); 
    const uploadTask = storageRef.child(`${firebaseRef}/${upload.file.name}`).put(upload.file); 

    uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED, 
     (snapshot) => { 
      // upload in progress 
      upload.progress = (snapshot.bytesTransferred/snapshot.totalBytes) * 100 
     }, 
     (error) => { 
      // upload failed 
      console.log(error) 
     }, 
     () => { 
      // upload success 
      upload.url = uploadTask.snapshot.downloadURL 
      this.urlSource.next(upload.url) 
      upload.name = upload.file.name 
      user.imagePath = this.downloadUrl; 
    // Place your http request inside a firebase event 
     return Observable.fromPromise(this.db.object(firebaseRef + '/' + user.$key).update(user)); 
     } 
    ); 
    return this.urlSource; 
} 

Diese

funktionieren könnte
Verwandte Themen