【问题标题】:returning response from firebase push从 Firebase 推送返回响应
【发布时间】:2019-01-20 19:28:03
【问题描述】:

我有一个代码可以在 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)
          }
        )
      })
  }

【问题讨论】:

  • 我不明白。 push() 返回一个类似承诺的对象。您甚至可以在代码中直接调用then()。这个承诺有什么问题吗?
  • 问题是我无法将其返回到我的 UI 端的调用函数以显示警报等。就像我给出的第二个示例一样,我将数据返回到调用方法。
  • 你不能只return this.db.list(...).push(...)?那应该从你的函数中返回承诺。

标签: angular firebase firebase-realtime-database promise


【解决方案1】:

此答案超出了您的问题范围,您的问题已在 cmets 中得到解答。

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

如果您使用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();
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多