在异步函数内部的循环中承诺

时间:2020-07-04 22:56:35

标签: javascript firebase redux google-cloud-firestore

我正在使用react和firebase和redux进行一个项目,并且有一些用户创建的项目。我将用户的ID存储在item对象中,以便以后可以显示该项目时填充用户。

现在,我正在尝试获取商品并通过将用户ID替换为有关用户的实际信息来对其进行修改,但是我有一个诺言问题。在我的代码中,我只是得到一个空数组,这意味着在返回最终结果之前修改没有得到解决。

export const getItems = () => {
  return (dispatch, getState, { getFirebase }) => {
    const firestore = getFirebase().firestore();
    const items = [];
    const dbRef = firestore.collection('items').orderBy('createdAt', 'desc').limit(2);

    return dbRef
      .get()
      .then((res) => {
        const firstVisible = res.docs[0];
        const lastVisible = res.docs[res.docs.length - 1];

        async function getData(res) {

/////////////////////////////////////////////// how to finish this code befor jumping to the return line
          await res.forEach((doc) => {
            firestore
              .collection('users')
              .doc(doc.data().owner)
              .get()
              .then((res) => {
                items.push({ ...doc.data(), owner: res.data() });
              });
          });
////////////////////////////////////////////////

          return { docs: items, lastVisible, firstVisible };
        }

        return getData(res);
      })
      .catch((err) => {
        console.log(err);
      });
  };
};

2 个答案:

答案 0 :(得分:1)

我不完全知道您要做什么,但是我建议您下令使代码易于阅读和使用。

您可以使用sudo nginx来管理异步循环。我建议采用类似的方式,免责声明,我确实做到了,可能有一些错误,但是您可以理解。

for of

答案 1 :(得分:0)

问题在于,承诺的数组本身并不是一个承诺-因此await将其变为无操作。

如果要全部异步加载它们,可以使用Promise.all解决。

const items = await Promise.all(res.map(async (doc) => {
  const res = await firestore.collection('users').doc(doc.data().owner).get();
  return { ...doc.data(), owner: res.data() };
});

否则,您可以按照其他答案中的建议await进入for循环。