当前位置: 首页 > 知识库问答 >
问题:

如何访问promise firestore返回的值?

苏鸿志
2023-03-14

我正在尝试访问秒napshot.data()返回的内容,但有一个问题,如下面的评论所述。我试图创建一个异步函数,但无济于事。知道出了什么问题吗?请查看2条评论。

  useEffect(() => {
    firestore.collection(`comments`).onSnapshot((snapshot) => {
      const posts = snapshot.docs
        .map((doc) => {
          const address = doc.data().comments?.map((comment) => {
            comment.get().then((secondSnapshot) => {
              console.log("snapshot", secondSnapshot.data());

              #I SEE WHAT I EXPECT TO SEE

              return secondSnapshot.data();
            });
          });
          console.log(address) #THIS RETURNS UNDEFINED FOR SOME REASON??

          return {
            username: doc.data().username,
            date: doc.data().date.seconds,
            text: doc.data().text,
            votes: doc.data().votes,
            comments: [],
          };
        });
      props.setComments(posts);
    });
  }, [location]);

共有1个答案

魏景龙
2023-03-14

除了@Mulan指出的React vs Firebase设计问题外,您的代码还有几个问题。

下面的map函数不返回任何内容。如果你不从这个街区返回一些东西,你将在地址中找不到任何东西。

const address = doc.data().comments?.map((comment) => {
/* This MUST return something */
});

您正在混合同步和异步代码。基本上,您尝试在对注释进行不同的异步调用之前打印地址值。get()已完成运行。

const address = doc.data().comments?.map((comment) => {
/* async code inside */
});
console.log(address); // this runs without waiting for the async code

如果您对旧的Promise语法感到困难,请尝试使用async/wait代替:

firestore.collection(`comments`).onSnapshot(async (snapshot) => {
    const postPromises = snapshot.docs
        .map(async (doc) => {
            const comments = doc.data().comments ?? []; // assign an empty array if there are no comments
            const secondSnapshots = await Promise.all(comments.map((comment) => comment.get()));
            const addresses = secondSnapshots.map((secondSnapshot) => secondSnapshot.data());
            console.log(addresses);
            return { /* ... */ };
        });
    const posts = await Promise.all(postPromises);
    props.setComments(posts);
});

我不确定你是否应该打电话给comment。get()在快照中,但这是另一个故事,我不是Firebase专家。

 类似资料:
  • 我是Scala期货的新手,我对Scala期货的回报值有疑问。 因此,scala未来的语法通常是 我想知道如何从调用此方法的其他方法访问。 换句话说, 那么应该用什么方法让< code>List[Int]脱离未来呢? 我尝试过使用地图方法,但无法成功做到这一点。

  • 问题内容: 我希望我的控制器在用户没有权限查看特定页面时返回正确的HTTP响应代码。 问题答案: 匆匆 如果您使用的是普通JSP视图(最常见),则只需添加 视图文件中的某处。在顶部是一个不错的地方。 详情 在MVC中,我将始终在视图中进行设置,在大多数情况下,对于Spring- MVC,请使用来呈现正确的视图以响应抛出的运行时Exception。 例如:在控制器或服务层中创建一个并将其抛出,并使异

  • 我如何返回那些在访问Milpitas之后访问Santa Clara或在访问#2之后访问#5的客户的?

  • 问题内容: 需要访问一个从PostgreSQL返回setof refcursor的过程。 我能够访问第一个对象,但不能访问其余对象,而不能访问其余对象。 这给了我第一个refcursor值,但是当我尝试使用第二个refcursor时给了我错误,我使用了这一行: 它给出了错误。还尝试了: 这也行不通。过程示例为: 请帮助我如何访问第二个对象。 问题答案: 表示您在调用时得到一个常规,其中每个“行”包

  • 我希望能够在RestController方法(或endpoint)作为数据流序列化为HttpServletResponse之前修改它返回的POJO。但是我希望能够在控制器方法代码之外(作为中间件)完成。 我曾尝试使用HandlerInterceptor来完成此操作,但我无法访问POJO。我也尝试过使用AOP,但从未调用切入点。 我希望能够在控制器执行自己的逻辑并返回后,向控制器返回的资源添加列表(

  • 我有一个Keycloak(独立)V1.9.4。最后在AWS实例上使用Wildfly 10安装安装程序,并尝试使用Keycloak(通过Keycloak的登录页面)和Twitter4j来验证Twitter用户,然后明显地让我的应用程序验证并查看用户的时间线等。 我已经配置了身份提供程序(Twitter)、领域和我的客户端应用程序。 我还在apps.Twitter.com上设置了一个Twitter应用