-3

我有一项服务,需要先将图片上传到Firebase存储并返回downloadurl。获取下载网址后,我需要将其存储到Firebase实时数据库中。使用Firebase在Angular 2中进行同步呼叫

但这里的问题是Firebase调用是异步的。

这是我的代码:

addCategory(category){ 

let storageRef = firebase.storage().ref(`category/${category.img_name}`); 
    //Upload file 

    storageRef.put(category.url) 
     .then((snapshot) => { 
    // Here i will get download url 
     var downloadUrl = snapshot.downloadURL; 
     category.category_icon = downloadUrl.toString(); 

     }) 

    //Problem occurs here return is executed before .then statement and my download url becomes undefined. 

     return this.http.post('https://app_name.cloudfunctions.net/api/products',body,{headers:headers}) 
     .map(res =>res.json()); 
    } 

所以,我需要知道是否有可能停止生产此调用(storageRef.put())的同步,这样我return语句应该只完成后触发。 put()调用。

在此先感谢!

回答

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 
}) 
    }) 
+0

是啊!我也尝试过。但是我调用这个服务函数addCategory(category)的组件是期待Return语句。所以我不能让http发布内部.then()。如果我写这么不行。因为我的调用函数使用。订阅 –

+0

@PraveenCool不会期望返回声明。直到你这样做,你将无法解决你的问题。你应该让它期望它可以链接的承诺。 –

+0

我更新我的答案看一看 –

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

     }) 

    }