【问题标题】:Get Data from a List of Firestore DocumentReferences to State React从 Firestore DocumentReferences 列表中获取数据到 State React
【发布时间】:2020-08-23 17:04:50
【问题描述】:

我有一个 Firebase DocumentReferences 列表,我需要获取数据并使用该数据设置状态。

这是我尝试过的:

useEffect(() => {
      let x = [];
      roomData.players.forEach(
        async (playerRef: FirebaseFirestoreTypes.DocumentReference) => {
          const playerSnap = await playerRef.get()
          x.push(playerSnap.data())
        }
      );
      setPlayers(x)

列表有 2 个项目。 状态被设置了 3 次。一次通常带有 2 个对象。第二次它被设置为一个空数组和 3 只有一个对象。

【问题讨论】:

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


    【解决方案1】:

    首先,您省略了关键部分,即useEffect的第二个参数,它决定何时调用setPlayers。

    其次,异步代码可能不会像您期望的那样运行,因为 x 的内容在传递给 setPlayers 时是不同步的。您不能在 forEach 中使用异步,因为无法等待所有结果。所以在这种情况下,setPlayers(x) 可能会在 x.push(playerSnap.data()) 之前被调用。

    所以最简单的改变就是将useEffect第一个参数改写为

    roomData.players.forEach(
      async (playerRef: FirebaseFirestoreTypes.DocumentReference) => {
        const playerSnap = await playerRef.get();
        setPlayers(prevPlayers => [...prevPlayers, playerSnap]);
      }
    );
    

    这会异步更新播放器。

    如果您需要玩家同步更新,例如只更新一次 UI,或者像在 Firestore 中一样反映玩家的顺序,则必须替换 forEach。一种这样的方法是使用简单的 for 循环来顺序获取。另一种方法是构造一个 promise 数组并将其提供给 Promise.all

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 2020-03-07
      • 2021-07-27
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多