Angular 发布到Firebase数据库参考之前的Firebase存储下载URL

Angular 发布到Firebase数据库参考之前的Firebase存储下载URL,angular,typescript,firebase,firebase-storage,angularfire2,Angular,Typescript,Firebase,Firebase Storage,Angularfire2,与firebase合作完成angular 4项目 我正在努力解决如何确保在运行下一步之前,已从可观察对象返回结果的问题 我知道你不能保证有一个可观测的,因为整个问题是它是一个数据流,因此我的困境 我正在尝试将图像上载到firebase存储,在运行firebase数据库更新之前检索其下载URL 如有任何建议,将不胜感激 注册用户服务 $key: string; downloadUrl: string; currentUser: any; loginId: string;

与firebase合作完成angular 4项目

我正在努力解决如何确保在运行下一步之前,已从可观察对象返回结果的问题

我知道你不能保证有一个可观测的,因为整个问题是它是一个数据流,因此我的困境

我正在尝试将图像上载到firebase存储,在运行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));
        });
    }
    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;
    }
$key:string;
下载URL:string;
当前用户:任何;
loginId:string;
建造师(
私有数据库:AngularFireDatabase,
私有firebaseUploadService:firebaseUploadService,
专用身份验证服务:身份验证服务){
this.firebaseuloadservice.currentUrl.subscribe(url=>this.downloadUrl=url);
}
registerUser(firebaseRef:string,user:UserModel):可观察{
//使用通过实体传递的文件为文件上载创建单独的对象
const file=Object.assign({},user.imagePath);
user.$key=this.authService.currentUserId;
返回此.firebaseUploadService.pushUpload(用户.$key,文件).switchMap(上载=>{
log('从服务返回的上载:',上载)
user.imagePath=this.downloadUrl;
返回Observable.fromPromise(这个.db.object(firebaseRef+'/'+user.$key).update(user));
});
}
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;
    }
currentUser:any;
上传:FirebaseListObservable;
私有urlSource=新行为主体('http://saveabandonedbabies.org/wp-content/uploads/2015/08/default.png');
currentUrl=this.urlSource.asObservable();
构造函数(){
}
pushUpload(firebaseRef:string,upload:UploadModel):任意{
const storageRef=firebase.storage().ref();
const uploadTask=storageRef.child(`${firebaseRef}/${upload.file.name}').put(upload.file);
uploadTask.on(firebase.storage.TaskEvent.STATE_已更改,
(快照)=>{
//正在上载
upload.progress=(snapshot.bytesttransfered/snapshot.totalBytes)*100
},
(错误)=>{
//上载失败
console.log(错误)
},
() => {
//上传成功
upload.url=uploadTask.snapshot.downloadURL
this.urlSource.next(upload.url)
upload.name=upload.file.name
}
);
返回此.urlSource;
}

由于所有Firebase调用都是异步的,因此无法同步获取下载url。但是有一个骗局,你可以通过承诺来做到

尝试按如下方式重构代码:

pushUpload(firebaseRef:string,upload:UploadModel):任意{

这可能有用