从Firebase push返回响应

时间:2018-08-14 02:37:37

标签: angular firebase firebase-realtime-database promise

我有如下代码可在firebase实时数据库中创建新记录

assignCoupon(email:string, discType: string, discVal: number, code:string){

    let coupon = {
      "discType" : discType,
      "discVal": discVal,
      "code": code
    }

    this.db.list('/users/' + uid + '/coupons').push(coupon).then(
      (resp) => console.log("user created with:" + resp)
    )

  }

这很好。但是我需要将响应作为承诺返回给调用代码,以便可以向用户显示消息。与snapshotChanges()不同,它不返回预订。那么在这种情况下我该怎么办呢?为了清楚起见,尝试使用与下面的代码相同的样式

getOrderHistory(uid:string){
    console.log('start of getOrderHistory with uid:' + uid)
    return new Promise((resolve, reject) =>
      {
        this.db.object("/users/" + uid + "/orders").snapshotChanges().map(
          (snapshot) => {return snapshot.payload.val()}
        ).subscribe(
          res => {
            //console.log('response:' + res)
            resolve(res)
          },
          err => {
            console.log(err)
            reject(err)
          }
        )
      })
  }

1 个答案:

答案 0 :(得分:1)

此答案不在您的问题范围内,您的问题已在评论中得到回答。

查看您的getOrderHistory函数,您可以使用rxjs/toPromise稍微整理一下诺言。

如果您使用valueChanges()而不是snapshotChanges(),则不需要map响应,因为angularfire2返回了有效载荷值。

使用.pipe(first())方法将获取第一个订阅事件(如果数据不存在,则为null)并将其包装为承诺。

此优化功能应该与上面的示例相同,并且不会留下您需要取消订阅的订阅,因为first运算符将在收到第一个值后关闭订阅。

// Import the operator
import { first } from 'rxjs/operators';


getOrderHistory(uid: string) {
    return this.db.object(`/users/${uid}/orders`)
      .valueChanges()
      .pipe(first())
      .toPromise();
  }