我正在尝试获取getDownloadURL()应该返回的网址。但是实际上它会返回诸如this之类的数据。
我设法将其显示在html上,但是我的真正目的是获取URL,该URL可以在我发布的图像上看到,因此我可以获取它并将其保存在Firestore数据库中。但是我不知道如何获得该价值。 这是我的摘录:
getImgFromServer(imgName: string): string {
let img;
let downloadIMG;
img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
let ref= firebase.storage().ref();
const imgRef = ref.child("/imgs/" + imgName);
imgRef.getDownloadURL().then(function(url){
downloadIMG=url;
img = downloadIMG;
console.log("MY URL " + downloadIMG)
})
console.log("img")
console.log(img)
return img
}
调试此日志时,此代码将显示我要使用的URL:
console.log("MY URL " + downloadIMG)
但是,这是从image打印数据的:
console.log(img)
我想单独返回该URL,以便可以使用它。
编辑
现在,我要获取URL,我想将其保存在Cloud Firestore上,以便可以使用HTML上的URL来显示图片。 这是存储图像名称的函数:
createPublic(id,img){
this.firestore.doc(`public/${id}`).set({
img,
});
}
有了弗兰克给出的答案,我现在可以获得URL,所以我只用它来获取URL,并使用以下功能来更新刚上传的文档。
async updateImg(img,idPubli){
const imgToUpdate= await this.imgServ.getImgFromServer(img);
this.imgServ.updateImgFromServer(imgToUpdate,idPubli)
}
updateImgFromServer(image,id){
this.firestore.doc(`public/${id}`).set({
img:image,
});
}
但是,它似乎不起作用。我可以想象这可能是因为在执行 updateImg()之前尚未上载图像或文档,但是我对异步函数还是有点陌生,所以我无法设法获得解决方案现在。
如果有帮助,这是我上传图像的功能和上传图像的功能。
submit() {
this.imgServ.uploadImage();
this.viewCtrl.dismiss({data});
}
在使用dismiss函数之后,我将收集所有数据,然后调用createPublic()函数。
uploadImage() {
this.image = 'movie-' + new Date().getTime() + '.jpg';
let storageRef: any,
parseUpload: any;
return new Promise((resolve, reject) => {
storageRef = firebase.storage().ref('imgs/' + this.image);
parseUpload = storageRef.putString(this.cameraImage, 'data_url');
parseUpload.on('state_changed', (_snapshot) => {
// We could log the progress here IF necessary
// console.log('snapshot progess ' + _snapshot);
},
(_err) => {
reject(_err);
},
(success) => {
resolve(parseUpload.snapshot);
});
});
}
答案 0 :(得分:0)
由于下载URL是通过调用服务器生成的,因此可能需要一些时间才能使用。而且,您不能使代码等待该值可用。这就是Package: myPackage
Version: 0.1.0
Title: This is my package
Author: Michael Chirico
Maintainer: Michael Chirico <my_email@gmail.com>
Depends: R
Description: My package is great!
Imports: Rcpp (>= 1.0.0)
LinkingTo: Rcpp
返回承诺,然后从服务器获得下载URL后调用其getDownloadURL()
的原因。该URL仅在回调中可用,因为回调后的代码在服务器返回下载URL之前(因此在调用then()
回调之前运行)。
一种常见的方法是仅兑现承诺,并在需要值时使用其then()
。所以:
then()
在现代环境中,替代方法是使用新的const imgRef = ref.child("/imgs/" + imgName);
const downloadUrl = imgRef.getDownloadURL();
...
downloadUrl.then(function(url){
console.log("MY URL " + url)
})
/ async
关键字。这些将上述基于诺言的方法包装在一些语法糖中:
await
然后您将其称为:
async getImgFromServer(imgName: string): string {
let img;
let downloadIMG;
img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
let ref= firebase.storage().ref();
const imgRef = ref.child("/imgs/" + imgName);
const downloadURL = await imgRef.getDownloadURL()
return downloadURL
}
另请参阅: