【问题标题】:Firestore Return True or False instead of the Promise ObjectFirestore 返回 True 或 False 而不是 Promise 对象
【发布时间】:2020-11-28 22:04:55
【问题描述】:

所以我有这个函数来将数据存储在 Firestore 数据库中,但我想检查该值是否已经存在,并基于此我想返回一个布尔值。 我一直试图用 async await 解决这个问题,但它似乎没有用。最后,当我在performanceRef.get() 之前添加return 时,它解决了这个问题。即使它解决了问题,我也不清楚为什么。我知道它一定与异步有关。有人能解释一下为什么添加这个 return 解决了这个问题吗?

export const createUserPerformanceDocument = async (user, currentDate, answer ) => {

  const createdAt = currentDate.toLocaleDateString('en-US');
  const performanceRef = firestore.doc(`performance/${user}`);
  return performanceRef.get()
    .then(doc => {
      if(doc.exists) {
        const docData = doc.data();
        if (docData[createdAt]) {
          return false
        } else {
          try {
            performanceRef.set({ 
              [createdAt]: {
                Question: answer
              }
            },  { merge: true })
            return true
          } catch(error) {
            console.log('Error creating performance data!', error.message);
            return false
          }
        }
      } else {
        console.log("This user does not exist in the database");
      }
    })

}

【问题讨论】:

  • 您的 async/await 版本可能只是做错了事,但由于您没有显示它,因此不可能知道。就目前而言,您并没有真正按照预期的方式使用 async/await。您可以删除 async 关键字,它仍然可以工作,因为您现在只是使用普通的 Promise 语法。
  • @DougStevenson 完全相同的代码,只是等待而不是返回。

标签: javascript firebase google-cloud-firestore promise async-await


【解决方案1】:

解决问题的不是 return,可能是您的 async/await 代码中存在一些问题,当您将其重写为 then 回调时,它按预期工作。

如果您想要更明确的答案,请随时发布您的 async/await 版本。

附:你不使用await关键字,所以你不需要async在函数之前修饰符

从 cmets 更新

Await 关键字只是帮助我们在当前行停止函数执行并等待 promise 解决。如果您想获得承诺的结果(在您的 then 回调中被命名为 doc),您需要将其存储在某个常量中:

const doc = await performanceRef.get()

所以你有了它,并且可以像在 then 回调中那样执行任何类型的验证。

如果您想从此函数返回验证结果,只需像之前一样使用 return 关键字。

【讨论】:

  • 这是完全相同的代码,并且在您看到我等待的返回的地方是这样的:await performanceRef.get() 我刚刚再次尝试,当调用该函数时它返回未定义但如果我加上返回,我开始收到一个布尔值。是的,我将删除该异步。谢谢。
  • 好的,我明白你在纠结什么。 Await 关键字只是帮助我们停止当前行的函数执行并等待 promise 解决。如果您想获得承诺的结果(在您的 then 回调中命名为 doc),您需要将其存储在某个常量中:const doc = await performanceRef.get() 这样您就拥有了它,并且可以像那时一样执行任何类型的验证打回来。如果您想从此函数返回验证结果,只需像之前一样使用 return 关键字。
  • 另外,将async/await 语法与 then 回调混合是一种不好的做法,因此请选择您喜欢的一种并在整个项目中继续使用它
  • aha 所以猜测唯一会改变的是 const doc = await performanceRef.get() 并在函数末尾添加 return doc。试过这个,似乎工作正常。
  • 另外,您能否用此信息更新上面的答案,我会接受。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2017-09-24
  • 1970-01-01
  • 2016-03-23
  • 2014-04-24
相关资源
最近更新 更多