与承诺和推进的Firestore

时间:2017-12-30 22:43:06

标签: javascript firebase google-cloud-functions google-cloud-firestore

感谢Frank在Firebase上helping me with this code。我刚刚在Friends集合下推送文档ID时遇到了这个问题。我不确定在下面的代码中将const friendIdconst accepted推送到friendsList数组的最佳方法是什么。

const db = admin.firestore();
const friendRef = 
db.collection('users').doc(id).collection('friends');

friendRef.get().then((onSnapshot) => {
  var promises = [];

  onSnapshot.forEach((friend) => {
    const personId = String(friend.data().person_id);
    const friendId = String(friend.id);
    const accepted = friend.data().accepted;

    promises.push(db.collection('users').doc(personId).get());
  });

  Promise.all(promises).then((snapshots) => {
    friendsList = [];
    snapshots.forEach((result) => {
      friendsList.push({
        friendId: friendId,
        accepted: accepted,
        firstName: result.data().name.first,
        lastName: result.data().name.last,
      });
    });
    res.send(friendsList);
  });
}).catch((e) => {
  res.send({
    'error': e
  });
})

我尝试了一些东西,但它没有用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

问题在于,您为每个promises值推送db.collection('users').doc(personId).get()数组中的调用friend。除了作为局部变量之外,您永远不会为每个朋友保留personIdfriendIdaccepted的值。

你应该把它们放在每一个承诺中。为此,您可以像这样返回自定义Promise。

promises.push(new Promise((resolve, reject) => {
    db.collection('users').doc(personId).get()
    .then(docResult => {
        resolve({         
            friendId: friendId,
            accepted: accepted,
            doc: docResult
        });
    })
    .catch(reason => {
        reject(reason);
    });
});

然后当你迭代快照数组时:

snapshots.forEach((result) => {
    friendsList.push({
        friendId: result.friendId,
        accepted: result.accepted,
        firstName: result.doc.data().name.first,
        lastName: result.doc.data().name.last,
    });
});

答案 1 :(得分:0)

正如我刚刚回答你对原始问题的回答一样,我的代码中有一个拼写错误源于混乱的变量名称。

const db = admin.firestore();
const friendRef = db.collection('users').doc(id).collection('friends');

friendRef.get().then((friendsSnapshot) => {
  var promises = [];

  friendsSnapshot.forEach((friend) => {
    const friendId = String(friend.data().person_id);    
    promises.push(db.collection('users').doc(friendId).get());
  });

  Promise.all(promises).then((friendDocs) => {
    friendsList = [];
    friendDocs.forEach((friendDoc) => {
      friendsList.push({
        personId: friendDoc.id,
        firstName: friendDoc.data().name.first,
        lastName: friendDoc.data().name.last,
      });
    });
    res.send(friendsList);
  });
}).catch((e) => {
  res.send({
    'error': e
  });
})

由于您正在使用doc(friendId)查找好友的数据,因此friendDoc.id回调中的then()将成为每位朋友的ID。

在这种情况下,我高度建议将Cloud Firestore参考文档放在手边。例如,在这种情况下,我发现DocumentSnapshot.id可以执行所需的操作。