使用Firebase在Angular 2中进行同步调用

时间:2017-08-14 18:43:58

标签: angular firebase firebase-realtime-database angular2-services firebase-storage

我有一项服务需要先将图片上传到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()调用后才会触发。

先谢谢!!

2 个答案:

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

      })

  }