我的firestore onSnapshot()函数被调用两次。
let user = firebase.firestore().collection('users').doc(userID).onSnapshot
({
next: (documentSnapshot: firebase.firestore.DocumentSnapshot) =>
{
this.userArray.push(documentSnapshot as User);
console.log(documentSnapshot);
//here
},
error: (firestoreError: firebase.firestore.FirestoreError) =>
{
console.log(firestoreError);
//here
}
});
我也试过在https://firebase.google.com/docs/firestore/query-data/listen#detach_a_listener订阅,方法是在// here注释中包含user(),但无济于事。
我如何修改这个函数只执行一次,即每次只推送一个用户对象而不是两次。
答案 0 :(得分:2)
如果您需要一次性响应,请使用.get()方法作为承诺。
firebase.firestore().collection('users').doc(userID).get().then(snap => {
this.userArray = [...this.userArray, snap.doc);
});
但是,我建议使用AngularFire(完全有偏见,因为我维护了库)。它使处理常见的Angular + Firebase任务变得更加容易。
答案 1 :(得分:2)
我不知道这是否与您的问题有关。如果正在使用
firebase.firestore.FieldValue.serverTimestamp()
给文档一个时间戳,然后onSnaphot将触发两次。这似乎是因为当您向数据库添加新文档onSnapshot将触发,但serverTimestamp尚未运行。几毫秒后,serverTimestamp将运行并更新您的document => onSnapshot将再次开火。
我想在onSnapshot引发之前添加一个小延迟(比如0.5s左右),但我找不到这样做的方法。
你也可以为onCreate事件制作服务器端功能,我相信这样可以解决你的问题。也许你的userArray.push-action更适合在服务器端执行。