【问题标题】:Function returning promise instead of value - react-native / javascript函数返回承诺而不是值 - react-native / javascript
【发布时间】:2020-11-20 16:44:50
【问题描述】:

这里我有一个函数,无论文档是否存在于集合中,它都应该返回真或假。查询工作正常,控制台日志中的结果实际上显示了要返回的正确布尔值。

async function isClaimed(voucher, user) {
  var db = Firebase.firestore();
  var result;
  
  await db
    .collection("ClaimedVoucher")
    .where("voucherID", "==", voucher)
    .where("userID", "==", user)
    .get()
    .then(function (querySnapshot) {
      if (querySnapshot.empty === false) {
        result = true;
      } else {
        result = false;
      }
    })
    .catch(function (error) {
      console.log("Error getting documents: ", error);
    }); 
  console.log(result, "this is result");
  return result;
}

但是,当我在控制台记录返回的内容时(在函数之外),它是承诺,而不是布尔值:

isVoucherClaimed = isClaimed(voucher.voucherID, uid);
          console.log(isVoucherClaimed);

显示:

承诺{ “_40”:0, “_55”:空, “_65”:0, “_72”:空, }

我读过异步函数总是返回承诺,但是如果我删除异步/等待,那么“结果”变量总是未定义的,即使在函数内部也是如此。任何帮助将不胜感激 - 我是 react-native / javascript 的新手。

【问题讨论】:

    标签: javascript reactjs firebase react-native google-cloud-firestore


    【解决方案1】:

    你已经知道了——异步函数总是会返回一个承诺。为了获得价值,您需要等待它被履行或拒绝。使用await.then()

    isVoucherClaimed = await isClaimed(voucher.voucherID, uid);
    

    【讨论】:

    • 感谢您的回复!但是,我在返回 JSX 的主函数中调用了“isVoucherClaimed”函数——我不能在该函数中使用 await,因为我必须将其转换为异步函数。你懂我的意思吗?我忘了提到我使用的是功能组件而不是类。
    • @kiermcguirk 您不应该在组件的根目录上运行异步代码 - 它可能应该在 useEffect 或事件处理程序中。无论如何,这是我在没有实际看到代码的情况下所能猜到的
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多