2017-07-07 13 views
0

firebaseを搭載したアンギュラー4プロジェクトで作業する。FirebaseストレージのダウンロードURLをFirebaseデータベースに送信する前に参照

次の手順を実行する前に、Observableから結果が返されたことを保証する方法を検討するのは苦労しています。

Observableでそのことを保証することはできませんが、全体のポイントはデータストリームなので、私のジレンマです。

firebaseデータベースに画像をアップロードしようとしていますが、のファイルをダウンロードする前に、そのダウンロードURL を取得しています。

アドバイスをいただければ幸いです。

登録ユーザーサービス

$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アップロードサービス

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; 
    } 

答えて

0

すべてFirebaseの呼び出しを使用すると、同期のダウンロードURLを取得カントは非同期なので。しかし約束を使ってそれをやることができるカンニングがあります。

は、以下のようにコードをリファクタリングしてみてください。

pushUpload(firebaseRef:文字列、アップロード:UploadModel):任意の{

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; 
} 

これは

を働くかもしれません
関連する問題