我有一项服务需要先将图片上传到Firebase存储并返回downloadurl。获取下载URL后,我需要将其存储到Firebase实时数据库中。
但问题是Firebase调用是异步的。
这是我的代码:
import pandas as pd
from glob import glob
file_list = glob(r'C:\Temp2\dl*.csv')
cols = [0,1,3,4,5]
df = pd.concat([pd.read_csv(f, header=None, usecols=cols)
.add_prefix('c')
.query("c0 in @det_list")
for f in file_list],
ignore_index=True)
所以我需要知道是否有可能停止使这个调用(storageRef.put())同步,这样我的return语句只有在完成.put()调用后才会触发。
先谢谢!!
答案 0 :(得分:0)
当你想在执行完成时等待,你应该从第一个“然后”返回URL,然后第二个“然后”将在第一个“然后”完成后执行
addCategory(category){
let storageRef = firebase.storage().ref(`category/${category.img_name}`);
//Upload file
return storageRef.put(category.url)
.then((snapshot) => {
return snapshot.downloadURL
}).then(url => { // this will excute after you get the url
category.category_icon = url.toString();
return this.http.post('https://app_name.cloudfunctions.net/api/products',body,{headers:headers})
.map(res =>res.json());
})
}
你可以像这样调用addCategory
addCategory(category).then(obs => {
obs.subscribe(res => {
// add your code here
})
})
答案 1 :(得分:0)
经过大量研究后我找到了解决方案。
addCategory(category){
// this.uploadImage(category);
//Upload file
let storageRef = firebase.storage().ref(`category/${category.img_name}`);
storageRef.put(category.url)
.then((snapshot) => {
var downloadUrl = snapshot.downloadURL;
category.category_icon = downloadUrl;
let body = this.categoryRefService.buildRequestBody(category);
let headers = this.categoryRefService.setHeaders();
return this.http.post('https://us-central1-app-name.cloudfunctions.net/api/products',body,{headers:headers})
.map(res =>res.json())
// Just moved my http request inside firebase promise and subscribed to http call here
.subscribe(data => {
this.result = data
});
})
}