【问题标题】:How do I return the result of a Firestore query in Typescript?如何在 Typescript 中返回 Firestore 查询的结果?
【发布时间】:2020-03-21 23:44:09
【问题描述】:

我在使用 Typescript 类方法 (Angular) 时遇到问题,我试图从 Firestore 查询返回结果(始终是单个数字),因此我可以从另一种方法中获取它并添加到 Firestore。我应该说我对 Typescript、Firestore 查询和 Promises 还很陌生。在 Typescript 中,我还没有找到关于 Firestore 查询 中返回 的具体问题。

我知道我的 return 语句是在检索数据之前执行的,但是我怎样才能返回结果,以便我可以通过另一种方法访问它并再次添加到 Firestore?我在调用方法startSessionPhase1 中的方法时遇到错误,因为我想检索一个数字,但方法getLastSession 正在返回一个承诺。

类型 'Promise' 不可分配给类型 'number'。

我的班级:

export class FirebaseService {
  moduleCollection: AngularFirestoreCollection<Module> = null;

  constructor(public afs: AngularFirestore) {
     this.moduleCollection = afs.collection('Modules');
  }

  getLastSessionP1() {
    var query = this.afs.collection("SessionsPhase1").ref.orderBy('session', "desc").limit(1);
    return query.get()
    .then(function (querySnapshot) {
      querySnapshot.forEach(function (doc) {
        doc.data().session;
      });
    })
    .catch((err) => {
      console.log(err.message);
    });
  }

startSessionPhase1(value) {
    var lastSessionP1: number = this.getLastSessionP1();
    console.log('lastSessionP1: ',lastSessionP1);
    return this.afs.collection('SessionsPhase1').add({
      variable: var, //etc
      session: lastSessionP1,
    });
  })();
}

【问题讨论】:

  • 你能把全班发完吗?
  • 还有什么你回来了?

标签: typescript promise google-cloud-firestore


【解决方案1】:

喜欢这段代码

 getLastSessionP1(): Promise<number|null> {
    var query = this.afs.collection("SessionsPhase1").ref.orderBy('session', "desc").limit(1);
    return query.get()
      .then(querySnapshot => querySnapshot.size > 0? querySnapshot.docs[0].data().session: null);
  }

 // method #1
this.getLastSessionP1().then(session => console.log(session));

// method #2
(async function () {    
var lastSessionP1: number = await this.getLastSessionP1();
console.log(lastSessionP1);
})();

【讨论】:

  • 我得到“'QuerySnapshot'类型上不存在属性'length'”
  • 我应该补充一点,我从另一个(非异步)方法调用该方法。我现在收到错误“'await' 表达式只允许在异步函数中使用”。
  • 太好了,谢谢!我使用了方法 1,现在可以在第二种方法中声明我的 lastSessionP1 变量。虽然,我意识到我在此方法中遇到了与第一个方法相同的问题,该方法的其余部分是在设置 lastSessionP1 之前执行的。此方法中的 return 语句将数据添加到 Firestore(包括有问题的变量)。抱歉,我意识到,我应该用更多代码更新我的问题!我可以通过使方法异步并使用等待来解决这个问题吗?
  • 不,getLastSessionP1 已经是异步的。而且您不能同步进行。这不取决于你。
  • 我指的是第二种方法,我称之为getLastSessionP1()。但我也意识到在尝试使其异步时出现编译错误。如果这与它有关,使用 Angular/Firebase?
猜你喜欢
  • 2019-11-11
  • 2018-05-10
  • 1970-01-01
  • 2022-01-14
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多