【问题标题】:Firestore onSnapshot promise do not resolveFirestore onSnapshot 承诺无法解决
【发布时间】:2021-01-30 13:03:29
【问题描述】:

我与 firebase 功能斗争了几天,今天我开始了本教程 https://codelabs.developers.google.com/firebase-emulator。然而在第 16 步有这样的事情:

await new Promise((resolve) => {
  const unsubscribe = aliceCartRef.onSnapshot(snap => {
    const expectedCount = 2;
    const expectedTotal = 9.98;
    
    console.log(snap.data());
    if (snap.data().itemCount === expectedCount && snap.data().totalPrice == expectedTotal) {
      console.log("We're in if!");
      unsubscribe();
      console.log("After subscribe!");
      resolve();
      console.log("After resolve!");
    };
  });
});

我自己放置了console.log,发现onSnap 函数运行了两次。第一次 snap 对象看起来像这样: { totalPrice: 0, itemCount: 0, ownerUID: 'alice' } 并且它不通过 if 条件。第二次 snap 是 { ownerUID: 'alice', totalPrice: 9.98, itemCount: 2 } 所以如果条件但 resolve() 没有关闭 Promise,它就会通过。最后因为超时,每次都测试失败。

为什么 resolve() 在第二次调用中不起作用?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    resolve() 只调用一次。您可以使用第二个电话。我认为您应该在 resolve() 之前获取所有数据。 例如:

    db.collection("cities").where("state", "==", "CA")
        .onSnapshot(function(querySnapshot) {
            var cities = [];
            querySnapshot.forEach(function(doc) {
                cities.push(doc.data().name);
            });
            console.log("Current cities in CA: ", cities.join(", "));
        });
    

    【讨论】:

      【解决方案2】:

      像这样比较非整数总是很危险的:

      snap.data().totalPrice == expectedTotal /* 9.98 */
      

      JavaScript(和大多数环境)将此类非整数存储为所谓的浮点数,它们的精度不可靠,因此很难与 == 进行比较。

      我不确定这是否是您的问题的原因,但您可以通过使用范围比较快速测试是否是:

      snap.data().totalPrice > 9.97 && snap.data().totalPrice < 9.99
      

      如果确实证明可以解决问题,请考虑以较小单位的整数增量存储金额。比如不是存储 9 美元和 98 美分,而是存储为 998 美分,这样比较就变成了:

      snap.data().totalPrice === 998
      

      整数的存储方式不同,不会像浮点数那样存在精度问题。

      【讨论】:

        【解决方案3】:

        感谢您的回复。然而问题出在另一个地方。包装代码的 lambda 函数具有参数“done”,这是未完成函数的原因。这就是为什么测试不通过。我的错。但是codelabs that google is sharing 有一些损坏的代码:(

        【讨论】:

          猜你喜欢
          • 2020-10-22
          • 1970-01-01
          • 2014-01-25
          • 1970-01-01
          • 2020-02-18
          • 2019-05-09
          • 2019-07-21
          • 2018-05-28
          • 2018-09-27
          相关资源
          最近更新 更多