firestore onSnapshot执行两次

时间:2018-04-23 01:06:44

标签: angular firebase google-cloud-firestore

我的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(),但无济于事。

我如何修改这个函数只执行一次,即每次只推送一个用户对象而不是两次。

2 个答案:

答案 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更适合在服务器端执行。

相关问题