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