在发布到Firebase数据库之前,Firebase存储下载URL参考
问题描述:
使用Firebase处理角4项目。在发布到Firebase数据库之前,Firebase存储下载URL参考
我正在努力解决如何确保在运行下一步之前已经从Observable返回结果。
我知道你不能保证与一个Observable,因为整点是一个数据流,因此我的困境。
我试图将图片上传到firebase存储,检索其下载网址,然后运行对Firebase数据库的更新。
任何意见,将不胜感激。
注册用户服务
$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));
});
}
火力地堡上传服务
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;
}
答
由于所有火力地堡的调用是异步的,你不能让下载URL同步。但是你可以使用promise来做一个作弊行为。
尝试如下重构代码:
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;
}
这可能会实现